Haskell-为什么我不能映射到列表的排序和分组列表?

时间:2018-08-02 14:10:31

标签: haskell

我有一个功能:

listLengths :: [Int] -> [Int]
listLengths xs = map length sort(group(xs))

sortgroup起作用,因此当我输入说[1,3,5,5,3]时,它会分开并将其分类为[[1],[3,3],[5,5]]。但是,当我如上所述添加map length时,应该说[1,2,2](每个列表的长度,但我似乎得到的都是类型错误。

1 个答案:

答案 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