2

次のコードを使用して、リストが2番目のリストのプレフィックスであるかどうか疑問に思っています:

prefix :: [a] -> [b] -> Bool
prefix [] _ = True
prefix _ [] = False
prefix (x:xs) (y:ys) = if (x==y) then prefix xs ys else False

しかし、それはエラーを返します:

Inferred type is not general enough
*** Expression    : prefix
*** Expected type : [a] -> [b] -> Bool
*** Inferred type : [a] -> [a] -> Bool

誰かがこれを機能させるのを手伝ってくれますか?

4

2 に答える 2

10

あなたの型署名は、2 つのリストが異なる型を持つことができると主張していますが、できません。そのため、コンパイラは、要求した型よりも一般的でない型を推論したと不平を言います。

于 2013-10-03T13:22:11.700 に答える
7

aこれは、名前を付けてb使用している型を比較しているためです(x==y)。の型を確認すると==、それらは同じ型であり、同等性テストがあることを意味します。

Prelude> :t (==)
(==) :: Eq a => a -> a -> Bool

したがって、推論される型シグネチャは実際にはEq a => [a] -> [a] -> Bool.

于 2013-10-03T13:30:53.347 に答える