先试试 《Learn You a Haskell》。暂不打算安装运行,仅将其中例程改为中文命名标识符。

第二章 起步

四则运算(+-*/)和布尔运算(&&   not)没啥特别。不等于是 /=

函数初步

succ 函数返回后续(successor)

> succ 8
9
> max 100 101  
101  
> succ 9 + max 5 4 + 1  // 函数优先级最高
16  
> (succ 9) + (max 5 4) + 1  
16  

创建函数:

翻倍 x = x + x
翻倍之和 x y = x*2 + y*2 // 这里原文被命名为了 doubleUs,考虑是不是要继续看这本。。。好歹看完这章吧
翻倍之和 x y = 翻倍 x + 翻倍 y
翻倍小的 x = if x > 100 then x else x*2

单引号可用于命名

列表介绍

ghci> [1,2,3,4] ++ [9,10,11,12]  
[1,2,3,4,9,10,11,12]  
ghci> "hello" ++ " " ++ "world"  
"hello world" 
ghci> 5:[1,2,3,4,5]  
[5,1,2,3,4,5]  

按索引取元素用 !!:

ghci> "Steve Buscemi" !! 6  
'B'  

列表可嵌套。列表间比较就是从头挨个元素比较直到比出大小。

head/tail 像是 scheme的 car/cdr,last/init 是反过来对尾部的类似操作:

    ghci> head [5,4,3,2,1]  
    5   
    ghci> tail [5,4,3,2,1]  
    [4,3,2,1]   
    ghci> last [5,4,3,2,1]  
    1   
    ghci> init [5,4,3,2,1]  
    [5,4,3,2]   

其他列表相关函数:

ghci> length [5,4,3,2,1]  
5 
ghci> null []  
True  
ghci> reverse [5,4,3,2,1]  
[1,2,3,4,5]  
ghci> take 3 [5,4,3,2,1]  
[5,4,3]
ghci> drop 3 [8,4,2,1,5,6]  
[1,5,6]
ghci> minimum [8,4,2,1,5,6]  
1  
ghci> maximum [1,9,2,3,4]  
9
ghci> sum [5,2,1,6,3,2,5,7]  
31  
ghci> product [6,2,1,2]  
24

这个有意思,中缀(infix)函数:

ghci> 4 `elem` [3,4,5,6]  
True

范围

ghci> ['a'..'z']  
"abcdefghijklmnopqrstuvwxyz" 
ghci> [3,6..20]   // 3为步进
[3,6,9,12,15,18] 
ghci> [0.1, 0.3 .. 1]  // 小数的不精确性导致问题
[0.1,0.3,0.5,0.7,0.8999999999999999,1.0999999999999999] 

不设上限则产生无限列表,如 take 24 [13,26..]

其他产生无限列表的方法:

cycle [1,2,3]
repeat 5

条件映射

仅留大写 文本 = [ 字母 | 字母 <- 文本, 字母 `elem` ['A'..'Z']]   

元组 (tuple)

元素个数决定了元组类型,列表中的元组必须类型相同。

双元素元组的方法:

ghci> fst (8,11)  // first
8  
ghci> snd ("Wow", False)  // second 这种时不时的命名缩写风格。。。
False  
ghci> zip [1,2,3,4,5] [5,5,5,5,5]  
[(1,5),(2,5),(3,5),(4,5),(5,5)]
ghci> zip [1..] ["苹果", "橘子", "樱桃", "芒果"]  
[(1,"苹果"),(2,"橘子"),(3,"樱桃"),(4,"芒果")]
ghci> let 直角三角形 = [ (a,b,斜边) | 斜边 <- [1..10], b <- [1..斜边], a <- [1..b], a^2 + b^2 == 斜边^2, a+b+斜边 == 24]  
ghci> 直角三角形
[(6,8,10)]  

第二章完