8. lambda 与效果系统
匿名函数用 (参数) => 表达式——单个不带注解的参数可省括号,写成 x => 表达式;
类型可推导时参数注解可省。函数类型写作
fn(A) -> B !e,其中 !e 是效果。纯函数看签名即知没有副作用,测试无需 mock。
pub fn main() -> Unit !io = {
let nums = [1, 2, 3, 4]
let evens = filter(nums, n => n % 2 == 0)
let doubled = map(evens, n => n * 2)
println(to_string(doubled))
}
在 Playground 打开
[4, 8]
高阶函数用效果变量转发参数的效果:map(f) 的效果等于 f 的效果。
两个函数参数的效果之并写作 !(e1 | e2)——纯 ∘ 纯还是纯,沾 io 便是 io。
fn compose[A, B, C](f: fn(A) -> B !e1, g: fn(B) -> C !e2) -> fn(A) -> C !(e1 | e2) =
a => g(f(a))
fn inc(x: Int) -> Int = x + 1
fn dbl(x: Int) -> Int = x * 2
pub fn main() -> Unit !io = {
let f = compose(inc, dbl)
println(to_string(f(10)))
}
在 Playground 打开
22