4

このタイプの同義語を考えると:

type Synonym a b = (a, b)

このコードはGHCiでは機能しません:

ghci> let myFirst (f, s) = f :: Synonym a b -> a

<interactive>:1:21:
    Inferred type is less polymorphic than expected
      Quantified type variable `b' is mentioned in the environment:
        f :: Synonym a b -> a (bound at <interactive>:1:13)
      Quantified type variable `a' is mentioned in the environment:
        f :: Synonym a b -> a (bound at <interactive>:1:13)
    In the expression: f :: Synonym a b -> a
    In the definition of `myFirst':
        myFirst (f, s) = f :: Synonym a b -> a

しかし、これはします:

ghci> let myFirst = fst :: Synonym a b -> a
-- no problem --

これは、GHCiに直接入力した場合にのみ発生します。両方の定義は、ファイルとそれらに入れると機能し:loadます。

ここでの問題は何ですか?私は何度もこの問題に遭遇しましたが、その理由はわかりませんでした。

ps試し:set -XNoMonomorphismRestrictionましたが、違いはありませんでした。

4

1 に答える 1

9

Haskell は、型シグネチャをfではなく に一致させようとしていますが、myFirstうまくいきません (それ以上の説明はできませんが、他の誰かですか?)。つまり、Haskell は次のように扱っています。

let myFirst (f,s) = (f :: Synonym a b -> a)

別の署名を与えることでこれを修正できます

let myFirst :: Synonym a b -> a; myFirst (f,s) = f

またはラムダを使用することもできます(これは本質的にmyFirst = fst定義と同等です)

let myFirst = (\(f,s) -> f) :: Synonym a b -> a

(これは型シノニムがなくても失敗することに注意してください:let myFirst (f,s) = f :: (a,b) -> aどちらも機能しません。)

于 2012-08-20T13:31:02.550 に答える