我正在尝试使用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)
这样做的正确方法是什么?
你做错了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].