绑定,绑定和单个赋值运算符之间的区别(&lt ;-)

时间:2012-02-13 00:25:34

标签: haskell

我不明白三种语法之间的区别:

  • where a = f (b)
  • do a <- f (b)
  • do let a = f (b)

我确实理解a <- f(b)与其他两个不同,在大多数情况下,我尝试了所有三个工作。另外,我在网上的某个地方读到了每个块,你应该尝试与一个让绑定相处,只是为了“惯用”。但我似乎无法管理。

我如何决定使用什么?

1 个答案:

答案 0 :(得分:26)

let foo = bar in ...只是在foo的上下文中将bar定义为与...完全相同的内容;您可以简单地使用文字替换来替换foo...(bar)的所有用途,并获得完全相同的结果。

where子句类似于let...in表达式,但是在函数子句的末尾,而不是表达式。例如,

foo x
    | p1 = ... y ...
    | p2 = ... y ...
  where
    y = ...

没有办法用let...in重写此内容而不将警卫更改为if...then...else。通常,where条款仅用于let...in条款,纯粹是出于风格的原因。

绑定运算符完全不同。它在do表示法中用于从monadic计算中“提取”一个值。也就是说,如果foo的类型为m a,则在x <- foo之后,x的类型为a。所有其他“绑定”表单只定义名称,但<-用于绑定计算结果到monad中的名称。 <-只能在do块中使用,因此它专门用于在与绑定结果的操作相同的monad中构建更大的计算。

let foo = bar符号中的

do只是一种便利;你可以改写:

do let foo = bar
   ...

作为

let foo = bar
in do ...

但是当你有很多这样的绑定时会变得混乱,因为do块会越来越深嵌套。

我不知道你提到的建议在谈论什么;你可以在let...in块中定义多个变量就好了,

let foo = ...
    bar ...
in ...

更惯用
let foo = ...
in let bar = ...
   in ...