首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Haskell -为什么我不能映射到列表的排序和分组列表中?

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

Stack Overflow用户
提问于 2018-08-02 22:10:31
回答 1查看 468关注 0票数 0

我有一个函数:

代码语言:javascript
运行
复制
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] (每个列表的长度,但我得到的似乎都是类型错误。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-02 22:13:57

因为在Haskell中,函数调用类似于f x,而不是f (x)。当然,在许多情况下,f (x)也可以工作,但在这里,您基本上已经编写了:

代码语言:javascript
运行
复制
listLengths xs = map length sort (group(xs))

或者更冗长:

代码语言:javascript
运行
复制
listLengths xs = ((map length) sort) (group(xs))

因此,哈斯克尔认为sort是一个独立的参数,而group (xs)是一个额外的参数。但由于sort是一个函数,而不是一个列表,类型检查器将引发错误。

你可以这样写它:

代码语言:javascript
运行
复制
listLengths :: [Int] -> [Int]
listLengths xs = map length (sort (group xs))

因此,我们在这里使用方括号来指定sort (group xs)是一个参数,该参数在具有函数map length :: [[a]] -> [Int]的函数应用程序中。

或者,我们可以使用一种无点方法,如:

代码语言:javascript
运行
复制
listLengths :: [Int] -> [Int]
listLengths = map length . sort . group

在这里,我们使用(.) :: (b -> c) -> (a -> b) -> a -> c函数将函数“链接”在一起。请注意,这里没有xs参数。因此,我们构造了一个新函数,该函数首先将group应用于输入,然后将该函数的输出传递给sort函数,最后将该函数应用程序的输出传递给map length函数。

这将产生输出:

代码语言:javascript
运行
复制
Prelude Data.List> listLengths xs = map length (sort (group xs))
Prelude Data.List> listLengths [1,3,5,5,3]
[1,1,1,2]

这并不完全是你想要的。这是因为现在我们构造为groups:[[1], [3], [5,5], [3]],然后我们像[[1], [3], [3], [5, 5]]一样对它们进行排序,然后当我们计算每个子元素的length时,它将导致[1, 1, 1, 2]

因此,您可能需要的是:

代码语言:javascript
运行
复制
listLengths :: [Int] -> [Int]
listLengths = map length . group . sort
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51655737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档