0%

Haskell 兩三事

在Imperative programming下待久了,對於Functional language的一切都是覺得很新鮮。
Learn You a Haskell for Great Good!看到中途,筆記一下一些新觀念。

List comprehension

跟數學裡面Set comprehension的表達方法很像,假設我們想要找出直角三角形中,周長小於50的三元組的數量。 (假設 a <= b <= c 且 a ^ 2 + b ^ 2 = c ^ 2)。

如果是以往的作法,大概會像這樣

1
2
3
4
5
6
7
8
9
for (int a = 1; a <= 10; a++)
#define sqr(x) (x * x)
typedef tuple<int, int, int> tuple3;
std::vector<tuple3> ans;
for (int a = 1; a <= 50; a++)
for (int b = a; b <= 50; b++)
for (int c = b; c <= 50; c++)
if ((sqr(a) + sqr(b) == sqr(c)) && ((a + b + c) < 50))
ans.push_back(make_tuple(a, b, c));

如果是Haskell會是這樣,不同的語言寫法會不一樣,不過這上面列的C++11實作方式還不如上面來的直覺。

1
let xs = [(a, b, c) | a <- [1..50], b <- [a..50], c <- [b..50], a ^ 2 + b ^ 2 == c ^ 2, a + b + c < 50]

Pattern Matching

這邊跟我們常知的Pattern Matching不太相同,