4

我可以let在其他表达式中使用。

foo n = (let a = True in (\x -> a)) 3

foo' n | n == 1 = let a = True in a
       | n /= 1 = False

但我不能这样做where

foo n = ((\x -> a) where a = True) 3

foo' n | n == 1 = a where a = True
       | n /= 1 = False

1:20:输入“where”时解析错误

在haskell中真的不可能还是我的错误?

4

4 回答 4

10

letis 一个表达式 while whereis 一个子句。where绑定到句法结构, let 可以在任何表达式可以使用的地方使用。

你当然可以这样写:

foo n = ((\x -> a)) 3 where a = True

foo' n | n == 1 = a
       | n /= 1 = False
       where a = True

或像这样:

foo n = (\a -> (\x -> a) 3) True
于 2012-10-09T20:45:53.277 回答
4

您需要将where子句放在末尾:

foo n = ((\x -> a)) 3
  where a = True

foo' n | n == 1 = a
       | n /= 1 = False
  where a = True

不同之处在于这let是一个表达式,而where需要绑定其他一些构造。参见let vs where

于 2012-10-09T20:45:05.120 回答
1

let ... in ...用于在表达式中引入名称绑定。

where是一种方便的语法,用于给出局部辅助定义以及方程。您只能将其用作方程式的一部分(最后),而不是任意表达式的中间。

它们的用法不一样。

于 2012-10-09T20:52:51.247 回答
0

在我看来,作为一种表达的主张let有点不对劲;在一个do块中它是一个语句,尽管我们说它在那里缩写let ... in。我认为要说的是

 let_in_ :: Statement -> Expression -> Expression
 _where_ :: Statement -> Statement  -> Statement

因此 a 的第一部分let是一个语句并且可以被 a 修改where。所以例如

 foo n = (let a = b where b = True in (\x -> a)) 3

 bip = do 
     let a = b where b = let c = d where d = True in c
     return a

同样,我们也许可以这样说:

 case_of_ :: Expression -> [Statement] -> Expression

所以例如

z x = case even x of 
   True -> d where d = x + 1
   False -> w - 1 where w = let a = x in a + 1 
于 2012-10-10T16:53:42.960 回答