我不明白三种语法之间的区别:
where a = f (b)
do a <- f (b)
do let a = f (b)
我确实理解a <- f(b)
与其他两个不同,在大多数情况下,我尝试了所有三个工作。另外,我在网上的某个地方读到了每个块,你应该尝试与一个让绑定相处,只是为了“惯用”。但我似乎无法管理。
我如何决定使用什么?
答案 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 ...