我有一个功能:
listLengths :: [Int] -> [Int]
listLengths xs = map length sort(group(xs))
sort
和group
起作用,因此当我输入说[1,3,5,5,3]
时,它会分开并将其分类为[[1],[3,3],[5,5]]
。但是,当我如上所述添加map length
时,应该说[1,2,2]
(每个列表的长度,但我似乎得到的都是类型错误。
答案 0 :(得分:2)
因为在Haskell函数中,调用的完成方式类似于f x
,而不是f (x)
。当然,在许多情况下,f (x)
也可以使用,但是您基本上已经在这里写过:
listLengths xs = map length sort (group(xs))
或更详细:
listLengths xs = ((map length) sort) (group(xs))
因此,Haskell将sort
视为一个独立参数,并将group (xs)
视为一个附加参数。但是由于sort
是一个函数,而不是一个列表,所以类型检查器将引发错误。
您可以这样写:
listLengths :: [Int] -> [Int]
listLengths xs = map length (sort (group xs))
因此,我们在这里使用方括号来指定sort (group xs)
是一个参数,即函数应用程序中带有功能map length :: [[a]] -> [Int]
的参数。
或者,我们可以使用无点方式,例如:
listLengths :: [Int] -> [Int]
listLengths = map length . sort . group
在这里,我们利用(.) :: (b -> c) -> (a -> b) -> a -> c
函数将函数“链接”在一起。请注意,此处没有xs
参数。因此,我们构造了一个新函数,该函数首先将group
应用于输入,然后将该函数的输出传递到sort
函数,最后将该函数应用程序的输出传递到{{1 }}功能。
这将产生输出:
map length
这并不完全是您想要的。这是因为现在我们按组构造Prelude Data.List> listLengths xs = map length (sort (group xs))
Prelude Data.List> listLengths [1,3,5,5,3]
[1,1,1,2]
,然后像[[1], [3], [5,5], [3]]
那样对它们进行排序,然后在计算每个子元素的[[1], [3], [3], [5, 5]]
时将得到[1, 1, 1, 2]
。 / p>
您可能想要的是:
length