在Haskell中处理null方法参数

时间:2018-04-10 06:53:27

标签: haskell

我已经尝试实现我的自定义地图功能,我得到这个错误并没有告诉我太多。

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]

为什么它不正确,因为我提供了从ab的谓词,a的来源列表,我希望列出b'小号

1 个答案:

答案 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]

因此,我们看到在列表中只有两种可能性,我们必须匹配这两种可能性。但是,功能并非如此。