如下
cylinder :: ( RealFloat a ) => a -> a -> a
cylinder r h =
let sideArea = 2 * pi * r * h
topArea = pi * r ^ 2
in sideArea + 2 * topArea
- let in表达式非常类似于where语法结构
- let in表达式用于在任何地方绑定变量,并且它们本身就是表达式,但它们是局部的,所以不能用在御林军之间
- let in表达式可以使用模式
- let in的形式是 let
in - 在let部分中定义的变量或函数可以在in部分中访问
因为let in是表达式,所以几乎可以在任何地方使用,如下
4 * (let a = 9 in a + 1) + 2
42
[let square x = x * x in (square 3, square 5, square 7)]
[(9, 25, 49)]
如果想在一行上定义多个变量,需要用分号分隔它们,如下
(let a = 100; b = 200; c = 300 in a * b * c, let foo = "Hey"; bar = "there!" in foo ++ bar)
let in表达式使用模式,如下
(let (a, b, c) = (1, 2, 3) in a * b *c) * 100
在内涵列表中使用let in表达式,如下
calcBmis :: (RealFloat a) => [(a, a)] -> [a]
calcBmis xs = [bmi | (w, h) <- xs, let bmi = w / h ^ 2, bmi >= 25.0]
- 内涵列表中的let像一个谓词,但它不过滤元素,只是定义变量
- 内涵列表中的let表达式定义的变量可以在输出函数(|之前的部分)以及let之后的所有谓词和部分中看到
- 内涵列表中的let in表达式的in部分省略了,因为定义变量的可见性是预先知道的
- 但是可以在谓词中使用let in表达式,并且定义的变量只在该谓词中可见