haskell 如何实现 list 中元素出现次数的统计呢?[已解决]
对于一个 list, 如何统计它其中每个元素都出现了多少次呢?
即这样的一个函数:
wordCount :: [a] -> [(a, Int)] 如何来实现呢?
谢谢各位了先。
-----------
group 是个好东东。
[ 本帖最后由 drunkedcat 于 2009-5-15 18:29 编辑 ]
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(9)
呵,还是看着 haskell 的语法简单些,可能是习惯了吧。
若说是跟 APL 学的,这我倒信
BTW,APL 的冗余度不是低,那简直是太低了。
换个写法,短一些。
{#[[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 编辑 ]
这个简直跟天书一样啊,还能叫语言么
这个在 Haskell 中是叫作 lambda abstraction,和在 lambda calculus 中一样。
嗯,不过 Mathematica 的语法实在是太疯狂了。。。
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 部分
lambda 表达式 x -> (head x, legth x)
思路跟 2 楼的 Haskell 代码是一样的。
稍稍解释下 mathematica 的语法撒,根本就看不懂,也猜不出来。。。
Mathematica
复制代码
写一个
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)]