【发布时间】:2012-03-04 11:27:20
【问题描述】:
我不明白这三种语法的区别:
where a = f (b)do a <- f (b)do let a = f (b)
尽管a <- f(b) 与其他两个不同,但我确实明白,在大多数情况下,我尝试了所有三个工作。此外,我在网上某处读到,每个块您应该尝试与一个 let 绑定相处,以便“惯用”。但我似乎从来没有管理过。
我如何决定使用什么?
【问题讨论】:
-
你一定是试错了。我几乎想不出将
a <- f b更改为let a = f b(反之亦然)不会破坏您的代码的情况。那是假设你之后实际使用a。 -
@sepp2k 是的,但是您可以轻松地重构代码以使其正常工作。与 let 和 where 相同,需要“次要”重构。正如我所提到的,我知道单个赋值运算符有些不同。我还是想知道有什么区别。
-
不,你不能。如果
f b具有非单子类型a <- f b将根本无法编译。您无法进行重构以使其编译(除非您将return填入其中以进行重构...)。如果f b确实具有一元类型,则let a = f b将导致a具有相同的类型。这几乎肯定会破坏使用a的代码。 -
@sepp2k 不确定我是否可以在这方面与您“竞争”,但如果我留在同一个 monad 中,这不重要吗?
-
我不确定你的意思。如果你在一个 do-block 中有多个
<-s,它们各自的右操作数必须在同一个 monad 中。但这与let无关。
标签: haskell syntax binding let do-notation