本文的内容:
通过 euler project 题目的 haskell 解法来学习这门语言。
代码来自 eu forum, haskell wiki,stackoverflow等等。
一些 haskell 学习资料:
http://learnyouahaskell.com
中文版 《Haskell趣学指南》
https://wiki.haskell.org
problem 1 - Multiples of 3 and 5
sum [n | n <- [1..999], n `mod` 5 == 0 || n `mod` 3 == 0]
ranges
轻而易举地获得 1 - 10 的 list, [1..10]
对 ascii 字符也有效 a - z,['a'..'z']
这只是最基本,你可以再加上想要的列表中的第二项来指定一个 “步长”
例如 1 - 100 的偶数,[2, 4..100]
不指定最后一项,则得到一个无限列表
take 20 [2, 4..]
取了前20个整数,因为 haskell 是懒惰求值的,所以这里只会计算20项。
cycle , repeat 两个函数都可以得到无限列表
cycle 将一个有限列表无限循环
repeat 是无限重复一个元素
replicate times element 返回 element 重复 times 次得到的 list
列表解析
列表解析是数学上的一个映射操作,返回的结果是一个列表
通常的形式是
# 以三个变量为例
[f(x, y, z) | 指明 x, y, z 定义域,约束1,约束2]
例如,生成所有满足 1<=x<=10, 1<=y<=10, x <= y
的整数点对
[(x, y) | x <- [1..10], y <- [1..10], x <= y]
其中
f(x, y) = (x, y)
x <- [1..10] 指明x的取值范围
x <= y 是一个约束,只有使得约束成立的值(即使得表达式值为 true)才会被送给 f 进行映射。
problem 2 - Even Fibonacci numbers
生成无限的 fibonacci sequence
https://wiki.haskell.org/The_Fibonacci_sequence
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)
sum $ filter even $ takeWhile (<=4000000) fibs
求 fibs 用到了 haskell 惰性求值特性。