eu in haskell

本文的内容:

  通过 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 惰性求值特性。

你可能感兴趣的:(haskell)