let in

发布时间 2023-04-07 04:15:00作者: 牧羊龟

如下

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表达式,并且定义的变量只在该谓词中可见