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 = ...
    
    如果不将防护装置更改为
    if…then…else
    s,则无法使用
    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 ...