免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 6210 | 回复: 3
打印 上一主题 下一主题

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

论坛徽章:
0
1 [报告]
发表于 2009-05-07 18:17 |显示全部楼层
写一个

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)]

论坛徽章:
0
2 [报告]
发表于 2009-05-11 13:33 |显示全部楼层
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}}
复制代码

论坛徽章:
0
3 [报告]
发表于 2009-05-11 14:42 |显示全部楼层
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 代码是一样的。

论坛徽章:
0
4 [报告]
发表于 2009-05-12 23:47 |显示全部楼层
换个写法,短一些。

{#[[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 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP