其他表达中的'where'

时间:2012-10-09 20:40:26

标签: haskell

我可以在其他表达式中使用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 个答案:

答案 0 :(得分:10)

let是一个表达式,而where是一个子句。 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

答案 1 :(得分: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

答案 2 :(得分:1)

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

where是用于给出局部辅助定义和等式的便捷语法。您只能将它用作等式的一部分(在结尾处),而不是在任意表达式的中间。

他们的用法并不相同。

答案 3 :(得分:0)

let表达的说法有点偏离,在我看来;在do块中,它是一个声明,尽管我们说它缩写为let ... in。我认为,要说的是

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

因此let的第一部分是一个陈述,可以由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