1

次の Haskell コードでは、関数 typeError は型チェックを行いません。

wrap x = [x]

listf :: [[a]] -> [[a]]
listf = id

typeCheck :: [a] -> [[a]]
typeCheck x = listf (wrap x)

typeError :: [a] -> [[a]]
typeError = wrap . listf

コメントを外すと、GHC は次のエラーを生成します。

Couldn't match type `a' with `[a0]'
  `a' is a rigid type variable bound by
      the type signature for typeError :: [a] -> [[a]] at tim.hs:10:1
Expected type: [a] -> [a]
  Actual type: [[a0]] -> [[a0]]
In the second argument of `(.)', namely `listf'
In the expression: wrap . listf

理由がわかりません。aと統合できるはずです[a0]-それらは独立した型変数です。これはまさに for typeCheck- と推測される型ですが、.演算子が使用されている場合はそうではありません。

Hugs は、非常によく似た偽のエラー メッセージを生成します。

ERROR "repro.hs":10 - Inferred type is not general enough
*** Expression    : typeError
*** Expected type : [a] -> [[a]]
*** Inferred type : [[a]] -> [[[a]]]

さらに、これはうまくいきます:

listf' :: [a] -> [a]
listf' = id

typeCheck' :: [a] -> [[a]]
typeCheck' = wrap . listf'

この問題は、[[a]] または [[[a]]] 以上でのみ発生します。ここでの取引は何ですか?

4

1 に答える 1