我可以在其他表达式中使用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或我的错误中真的不可能吗?
答案 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