我已经尝试实现我的自定义地图功能,我得到这个错误并没有告诉我太多。
mymap::(a->b)->[a]->[b]
mymap _ [] =[]
mymap null (x:xs)=x:xs
mymap f (x:xs)=f x : mymap f xs
错误讯息:
* Couldn't match type `a' with `b'
`a' is a rigid type variable bound by
the type signature for:
mymap :: forall a b. (a -> b) -> [a] -> [b]
为什么它不正确,因为我提供了从a
到b
的谓词,a
的来源列表,我希望列出b
'小号
答案 0 :(得分:3)
Haskell中没有null
指针,所以这一行:
mymap null (x:xs) = (x:xs)
相当于
mymap _ s = s
由于null
只是匹配所有值而不管值,因此是有效的标识符。例如,您可以说null = 6
,它在Haskell中有效。
因此给出函数类型mymap :: b -> [a] -> [a]
,它与您想要的类型不同。
你应该删除该行。 “正确”的实施是:
mymap :: (a -> b) -> [a] -> [b]
mymap _ [] = []
mymap f (x:xs) = f x : map f xs
您在[]
和(:)
上进行模式匹配是正确的,因为在列表类型的声明中,都会发生:
-- Compiler magic occurs here! This is not usually valid syntax
data [a] = [] | a : [a]
因此,我们看到在列表中只有两种可能性,我们必须匹配这两种可能性。但是,功能并非如此。