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

Hoo*_*ook 2 haskell

我正在尝试使用map一个函数来获取列表列表的最后一个元素.例如:

 [ [0,0,4],[2,4,2],[1,3,5],[3,1,1] ] => [4,2,5,1]
Run Code Online (Sandbox Code Playgroud)

我写过:

 func l = map (last l) 
Run Code Online (Sandbox Code Playgroud)

并得到此错误:

    > 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]
Run Code Online (Sandbox Code Playgroud)

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

GS *_*ica 7

你做错了last.您要做的是将其应用于外部列表中的每个内部列表l.你实际在做的是将它应用到外部列表l本身,然后map没有意义.

你需要写map last l.

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

map :: (a -> b) -> [a] -> [b]
Run Code Online (Sandbox Code Playgroud)

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

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

在这种情况下,您的列表l是类型的东西[a],所以a= [Integer](忽略数字重载).第一个参数应该是类型的函数[Integer] -> b,并且您希望使用last哪个表示b= Integer.因此最终结果将是所需的类型[Integer].