无心人 发表于 2008-5-9 23:44:18

Haskell自我娱乐帖

来自网友教导
均为论坛上某些问题的部分算法的haskell的实现问题
来自QQ群热心网友的指点
放在这里以做记录
=====================================
几个链接
函数和例子查询http://www.zvon.org/other/haskell/Outputglobal/index.html
Hooglehttp://www.haskell.org/hoogle/

无心人 发表于 2008-5-9 23:53:40

base=
生成n位数字,所有数字来自base
let base=
let foo _ [] = []; foo 0, _ = []; foo 1 x = ; foo n x =

假设生成8位的
foo 8 base
=======================================================
由一维列表生成二维的
let base=
不排除相等的
let base2=[ (x, y) | x <- base, y<- base ]
(1, 1)也在里面
排除相等的
let base2=[ (x, y) | x <- base, y<- base, x /= y ]
(1, 1)类的排除
排除相等且对称的,即(1, 2) (2, 1)只要一个
let inner x [ ] = [ ]; inner x (y:ys) = (x, y):inner x ys;
let outer [ ] = [ ]; outer (x:xs) = inner x xs ++ outer xs;
然后
outer base
或者
let a =
let b [] = []; b (x:xs) = map ((,) x) xs ++ b xs;
b a
显示
[(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)]

另外一种情况
将连接成[...(x, y)...] 1 <= x<= y <= 4的
let a =
let b [] = []; b (xs@(x:xe)) = map ((,) x) xs ++ b xe;
b a
显示
[(1,1),(1,2),(1,3),(1,4),(2,2),(2,3),(2,4),(3,3),(3,4),(4,4)]

无心人 发表于 2008-5-10 22:58:58

刚才无聊
去生成8位的全由1379组成的素数
结果发现haskell的惰性计算比较好玩
得到结果,很快的
但如果显示结果,就要计算了
中间我给Cancel掉了
但我重新启动显示结果
则刚才Cancel之前的很快滚动过去,证明是早已计算了
然后从上次取消的位置开始又重新变慢,是在继续计算了

共得到9177个结果
得到结果的时间确实要比C代码慢些
但如果算上写程序和调试
则比C快很多了

无心人 发表于 2008-5-11 19:15:52

等幂和问题7次幂一个例子
左面
[1,4,6,7,10,11,13,16,18,19,21,24,25,28,30,31,34,35,37,40,41,44,46,47,49,52,54,55
,58,59,61,64,66,67,69,72,73,76,78,79,81,84,86,87,90,91,93,96,97,100,102,103,106,
107,109,112,114,115,117,120,121,124,126,127,130,131,133,136,137,140,142,143,145,
148,150,151,154,155,157,160,161,164,166,167,170,171,173,176,178,179,181,184,185,
188,190,191,193,196,198,199,202,203,205,208,210,211,213,216,217,220,222,223,226,
227,229,232,233,236,238,239,241,244,246,247,250,251,253,256]
右面
[2,3,5,8,9,12,14,15,17,20,22,23,26,27,29,32,33,36,38,39,42,43,45,48,50,51,53,56,
57,60,62,63,65,68,70,71,74,75,77,80,82,83,85,88,89,92,94,95,98,99,101,104,105,10
8,110,111,113,116,118,119,122,123,125,128,129,132,134,135,138,139,141,144,146,14
7,149,152,153,156,158,159,162,163,165,168,169,172,174,175,177,180,182,183,186,18
7,189,192,194,195,197,200,201,204,206,207,209,212,214,215,218,219,221,224,225,22
8,230,231,234,235,237,240,242,243,245,248,249,252,254,255]
方幂和
1171017999358189568

程序
let l 1 = ;l n = l (n-1) ++ map (+2^n) (r (n-1))
let r 1 = ;r n = r (n-1) ++ map (+2^n) (l (n-1))
l 7
r 7
方幂和
sum (map (^7) (l 7))
sum (map (^7) (r 7))

gxqcn 发表于 2008-5-12 07:41:40

程序确实够简洁,
估计语法规则也很多吧,恐一时半会难掌握。

无心人 发表于 2008-5-12 08:48:55

:)

语法属于那种小规则,大模式的语言
该语言源代码除了部分核心是C/C++写的
大部分都是用自身语言写的

另外,你看到的都是函数
而不是语法

无心人 发表于 2008-5-12 09:30:53

GxQ5次48个数字等幂和验证
Prelude> let left = [1, 2, 7, 10, 11, 12, 13, 14, 16, 17, 21, 22, 27, 28, 32, 33
, 35, 36, 37, 38, 39, 42, 47, 48]
Prelude> let right = [3,4,5,6,8,9,15,18,19,20,23,24,25,26,29,30,31,34,40,41,43,4
4,45,46]
Prelude> length left
24
Prelude> length right
24
Prelude> sum (map (^5) left)
1084022688
Prelude> sum (map (^5) right)
1084022688
Prelude>

无心人 发表于 2008-5-12 14:42:33

一个函数
对List求固定数量元素的List
let selectDistinct 0 _ = [[]];selectDistinct _ [] = [];selectDistinct n xs = [ y ++ | (xss,x:_) <- (drop (n-1) . init) (zip (inits xs) (tails xs)), y <- selectDistinct (n-1) xss ]

let test =
selectDistinct 2 test
[,,,,,]

无心人 发表于 2008-5-12 20:03:30

Prelude List> sum (map (^3) n16)
18496
Prelude List> div 18496 2
9248
Prelude List> let f1 x = (sum (map (^3) x)) == 9248
Prelude List> filter f1 (selectDistinct 8 n16)
[,]
Prelude List> n16

证明前16正整数的3次幂划分仅有一个

因为sum (map (^3) n14)=11025说明不存在1-14的3次幂划分

无心人 发表于 2008-5-12 20:07:52

[,,[2,4,5,7,12,13,14,16,1
7,18],,,[2,4,5,9,11,12,13,
16,17,19],,,[1,2,3,7,11,12,
14,16,17,19],,,[2,3,5,6,8,1
0,15,16,18,19],,,[1,4,7,9,1
1,12,13,14,17,20],,,[4,5,6,
8,9,10,13,15,18,20],,,[1,3,
6,7,8,10,14,15,18,20],,,[1,3
,6,8,9,10,11,15,19,20],,]

同样道理求得前20的3次幂划分是13组
页: [1] 2 3 4 5 6
查看完整版本: Haskell自我娱乐帖