Functional Programming on Lists
map: transform [a] to [f(a)]
1 | -- 函数签名 |
filter
1 | filter :: (a -> Bool) -> [a] -> [a] |
Utilities
words 可以把 String 按空格分割开来
tails 可以返回一个字符串的全部后缀
Partial Application
当一个参数传入函数,默认总是占据最左侧没被赋值的参数
Prefix and Infix Notations
每一个中缀形式的运算符都有等价形式的前缀形式,写法是用括号 () 包住运算符然后提前
1 | 1 + 2 |
zipWith
1 | -- 函数签名 |
Lambda Functions
定义一个匿名函数的方式如下
1 | -- 反斜杠,用空格隔开的参数,->,函数体 |
. 运算符与 $ 运算符
点运算符
. 运算符将多个函数结合,类似于数学里面的记号
1 | (.) :: (b -> c) -> (a -> b) -> a -> c |
美元运算符
1 | ($) :: (a -> b) -> a -> b |
$ 的作用主要是用于消除函数嵌套时的括号:
1 | f1 (f2 (f3 ...... (fn x))) |
More Functions
takeWhile, dropWhile
takeWhile, dropWhlie 与 filter 的区别在于,takeWhile, dropWhlie 其实是只考虑列表的前缀,而 filter 是过滤整个列表。
1 | takeWhile :: (a -> Bool) -> [a] -> [a] |
elem
检查元素是否在列表里面。
const
总是返回两个参数里的第一个参数
1 | const :: a -> b -> a |
Lists and Recursion
- 在列表头添加元素
1 | (:) :: a -> [a] -> [a] |
Pattern Matching for Lists
1 | [x:_] -- 提取列表第一个元素 |
Tail Recursion
类似的,列表上的递归函数也可以应用尾递归
List Comprehension
和 Python 一样,Haskell 也有列表操作
1 | [f x | x <- lis] -- <=> map f lis |
同样支持其他操作
1 | -- 多个列表 |
自定义(中缀)运算符
Haskell 里的运算符定义只需要任意符号即可
1 | -- For example |
Typed Holes
类似于 C++ 的 auto,Haskell 可以自动推导 _<name> 的类型,但是会通过报错的形式告诉你
定义语法是:下划线 _ + 任意名字
1 | keepElements :: [a] -> [Bool] -> [a] |