Haskell where绑定、let绑定和单个赋值运算符(<;-)之间的差异
我不理解这三种语法之间的区别:Haskell where绑定、let绑定和单个赋值运算符(<;-)之间的差异,haskell,syntax,binding,let,do-notation,Haskell,Syntax,Binding,Let,Do Notation,我不理解这三种语法之间的区别: 其中a=f(b) do a让foo=bar in…简单地定义foo在的上下文中与bar完全相同;您可以简单地使用文本替换,用(bar)替换中foo的所有用法,得到完全相同的结果 where子句类似于let…in表达式,但位于函数子句的末尾,而不是表达式。比如说, foo x | p1 = ... y ... | p2 = ... y ... where y = ... 如果不将防护装置更改为if…then…elses,则无法使用le
其中a=f(b)
do a
简单地定义让foo=bar in…
在foo
的上下文中与
完全相同;您可以简单地使用文本替换,用bar
替换(bar)
中
的所有用法,得到完全相同的结果foo
子句类似于where
表达式,但位于函数子句的末尾,而不是表达式。比如说,let…in
如果不将防护装置更改为foo x | p1 = ... y ... | p2 = ... y ... where y = ...
s,则无法使用if…then…else
重写此命令。通常情况下,let…in
子句在其中
子句上使用纯粹是出于风格的原因let…in
bind操作符是完全不同的。它在
表示法中用于从一元计算中“提取”一个值。也就是说,如果do
的类型为foo
,那么在ma
x之后,您一定是尝试了错误。我几乎想不出有哪种情况会改变
a@sepp2k是的,但是您可以轻松地重构代码使其工作。对于let和where,同样需要进行“小”重构。正如我提到的,我知道单一赋值运算符在某种程度上是不同的。我还是想知道区别是什么。不,你不能。如果
有一个非一元类型fb
a@sepp2k,我不确定我是否能在这方面与你“竞争”,但如果我留在同一个单子上,这不重要吗?我不确定你的意思。如果您有多个
do let foo = bar ...
let foo = bar in do ...
let foo = ... bar ... in ...
let foo = ... in let bar = ... in ...