尝试映射列表列表时,为什么会出现此错误?

时间:2014-07-04 22:50:11

标签: haskell

我正在尝试使用map编写一个函数,该函数接受列表列表的最后一个元素。例如:

 [ [0,0,4],[2,4,2],[1,3,5],[3,1,1] ] => [4,2,5,1]

我写过:

 func l = map (last l) 

并收到此错误:

    > ERROR - Type error in application
 Expression     : func [[0,0,4],[2,4,2],[1,3,5],[3,1,1]]
 Term           : [[0,0,4],[2,4,2],[1,3,5],[3,1,1]]
 Type           : [[c]]
 Does not match : [a -> b]

这样做的正确方法是什么?

3 个答案:

答案 0 :(得分:7)

您使用last做错了事。您要做的是将其应用于外部列表l内的每个内部列表。你实际做的是将它应用到外部列表l本身,然后map毫无意义。

您需要改为编写map last l

您可以从其类型中看到map的参数的正确形式:

map :: (a -> b) -> [a] -> [b]

这意味着map有两个参数,一个是a -> b类型,另一个是类型[a]

请注意,在您的代码中,您只给它第一个参数(last l)。这一般在Haskell中是有效的事情(查找"部分应用"或" currying"),但这里第一个参数应该是一个函数而{{1}当然不是。

在这种情况下,您的列表last l属于l类型,因此[a] = a(忽略数字重载)。第一个参数应该是[Integer]类型的函数,并且您希望使用[Integer] -> b,这意味着last = b。因此,最终结果将是Integer类型。

答案 1 :(得分:1)

尝试

func l = map last l

没有括号。

如果你看一下func [[0,0,4],[2,4,2],[1,3,5],[3,1,1]电话中的类型,你会注意到l = [[0,0,4],[2,4,2],[1,3,5],[3,1,1]]以来,l的类型是[[c]],但是last l的类型} [c][a -> b],而地图需要{{1}}作为它的第一个参数。

答案 2 :(得分:1)

甚至使用无点符号: f = map last

其中,在ghci中,产生类型:

GHCI> let f = map last
GHCI> :t f
f :: [[b]] -> [b]
GHCI> f [ [0,0,4],[2,4,2],[1,3,5],[3,1,1] ]
[4,2,5,1]