我正在尝试使用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]
这样做的正确方法是什么?
答案 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]