haskell 如何实现 list 中元素出现次数的统计呢?[已解决]

发布于 2022-08-09 06:22:24 字数 236 浏览 12 评论 9

对于一个 list, 如何统计它其中每个元素都出现了多少次呢?

即这样的一个函数:

wordCount :: [a] -> [(a, Int)] 如何来实现呢?

谢谢各位了先。

-----------
group 是个好东东。

[ 本帖最后由 drunkedcat 于 2009-5-15 18:29 编辑 ]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

爱格式化 2022-08-22 15:41:27

呵,还是看着 haskell 的语法简单些,可能是习惯了吧。

青衫负雪 2022-08-22 15:41:02

原帖由 win_hate 于 2009-5-12 23:47 发表
换个写法,短一些。

{#[[1]], Length@#} & /@ Split@Sort@L

Mahtematica 在认祖追宗时说受了 APL 的影响,APL 的冗余度是低了点。

若说是跟 APL 学的,这我倒信

BTW,APL 的冗余度不是低,那简直是太低了。

过潦 2022-08-22 15:40:31

换个写法,短一些。

{#[[1]], Length@#} & /@ Split@Sort@L

Mahtematica 在认祖追宗时说受了 APL 的影响,APL 的冗余度是低了点。

不过也没楼上两位说得那么夸张吧?用过 perl 和 shell 的人还能怕这个?

======================================

加个清晰版:

f = Function[{x}, {Part[x, 1], Length[x]}]
Map[f, Split[Sort[L]]]

[ 本帖最后由 win_hate 于 2009-5-12 23:55 编辑 ]

吲‖鸣 2022-08-22 15:40:01

这个简直跟天书一样啊,还能叫语言么

零度° 2022-08-22 15:37:58

原帖由 win_hate 于 2009-5-11 14:42 发表
lambda 表达式在 Mathematica 中称为纯函数,可以用 Function 来构建。比如 x y->x+y 可以表示为

这个在 Haskell 中是叫作 lambda abstraction,和在 lambda calculus 中一样。

思路跟 2 楼的 Haskell 代码是一样的。

嗯,不过 Mathematica 的语法实在是太疯狂了。。。

梦回梦里 2022-08-22 15:24:30

mathematica  的函数用 [] 而不是 (),所以我们习惯的 f (x) 要写成 f[x]

由于 [] 被函数用掉了,所以列表用 {}, 若 L 是列表,则 L[[n]] 取第 n 个元素。

前缀 f[x]
后缀 x//f
二元函数,中缀 x~f~y

/@ 是 Map 的简写,也可以用 Map,

Split 类似 Haskell, List 模块中 的 group

lambda 表达式在 Mathematica 中称为纯函数,可以用 Function 来构建。比如 x y->x+y 可以表示为

Function[{x,y}, x+y]

也可以简写为 #1+#2 &,后面要有个 &,于是  #1+#2 & [1,2] 得到 3。

{#[[1]], # // Length} & /@ (L // Sort // Split)

分为 3 部分

  • (L//Sort//Split) 后缀使用 Sort 和 Split
  • {#[[1]], # // Length} &
    lambda 表达式 x -> (head x, legth x)

  • /@ 是 Map

思路跟 2 楼的 Haskell 代码是一样的。

奢欲 2022-08-21 21:24:05

原帖由 win_hate 于 2009-5-11 13:33 发表
Mathematica

稍稍解释下 mathematica 的语法撒,根本就看不懂,也猜不出来。。。

酷炫老祖宗 2022-08-20 07:37:01

Mathematica

  1. L={1,1,2,1,3,2,1,2,2,3,4,2}
  2. {#[[1]], # // Length} & /@ (L // Sort // Split)
  3. {{1, 4}, {2, 5}, {3, 2}, {4, 1}}

复制代码

指尖上得阳光 2022-08-12 17:38:25

写一个

Prelude List> x
[1,1,2,1,3,2,1,2,2,3,4,2]

Prelude List> [(head x, length x)| x<- group $ sort x]
[(1,4),(2,5),(3,2),(4,1)]

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文