免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-07 17:04 |只看该作者 |倒序浏览
对于一个 list, 如何统计它其中每个元素都出现了多少次呢?

即这样的一个函数:

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

谢谢各位了先。

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

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

论坛徽章:
0
2 [报告]
发表于 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
3 [报告]
发表于 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}}
复制代码

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
4 [报告]
发表于 2009-05-11 14:20 |只看该作者
原帖由 win_hate 于 2009-5-11 13:33 发表
Mathematica


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

论坛徽章:
0
5 [报告]
发表于 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 代码是一样的。

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
6 [报告]
发表于 2009-05-11 15:28 |只看该作者
原帖由 win_hate 于 2009-5-11 14:42 发表
lambda 表达式在 Mathematica 中称为纯函数,可以用 Function 来构建。比如 \x y->x+y 可以表示为

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

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

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

论坛徽章:
0
7 [报告]
发表于 2009-05-12 21:18 |只看该作者
这个简直跟天书一样啊,还能叫语言么

论坛徽章:
0
8 [报告]
发表于 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 编辑 ]

论坛徽章:
95
程序设计版块每日发帖之星
日期:2015-09-05 06:20:00程序设计版块每日发帖之星
日期:2015-09-17 06:20:00程序设计版块每日发帖之星
日期:2015-09-18 06:20:002015亚冠之阿尔艾因
日期:2015-09-18 10:35:08月度论坛发贴之星
日期:2015-09-30 22:25:002015亚冠之阿尔沙巴布
日期:2015-10-03 08:57:39程序设计版块每日发帖之星
日期:2015-10-05 06:20:00每日论坛发贴之星
日期:2015-10-05 06:20:002015年亚冠纪念徽章
日期:2015-10-06 10:06:482015亚冠之塔什干棉农
日期:2015-10-19 19:43:35程序设计版块每日发帖之星
日期:2015-10-21 06:20:00每日论坛发贴之星
日期:2015-09-14 06:20:00
9 [报告]
发表于 2009-05-13 08:15 |只看该作者
原帖由 win_hate 于 2009-5-12 23:47 发表
换个写法,短一些。

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


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

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

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

论坛徽章:
0
10 [报告]
发表于 2009-05-15 18:28 |只看该作者
呵,还是看着 haskell 的语法简单些,可能是习惯了吧。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP