我是新的哈斯克尔和我非常困惑的 在哪里与 让。它们似乎都提供了一个相似的目的。我已经阅读了一些 在哪里和 让之间的比较,但是我很难分辨什么时候使用它们。能否有人提供一些上下文或者一些例子来说明什么时候应该使用一个而不是另一个?
哪里 VS 让
where
子句只能在函数定义级别定义。通常,这与let
定义的范围相同。唯一的区别是当警卫被使用的时候.where
子句的范围扩展到所有警卫。相反,let
表达式的作用域只是当前函数子句和约束(如果有的话)。
Haskell Wiki非常详细,提供了各种情况,但它使用了假设的例子。我觉得对于一个初学者来说,它的解释太简短了。
Let 的优点:
f :: State s a
f = State $ \x -> y
where y = ... x ...
将不会工作,因为在哪里指 模式匹配 f = ,其中没有 x 在范围内。相反,如果你有 从 let 开始,然后你就不会 有麻烦了。
f :: State s a
f = State $ \x ->
let y = ... x ...
in y
Where 的优点 :
f x
| cond1 x = a
| cond2 x = g a
| otherwise = f (h x a)
where
a = w x
f x
= let a = w x
in case () of
_ | cond1 x = a
| cond2 x = g a
| otherwise = f (h x a)
Haskell wiki 提到,在哪里子句是声明性的,而 让表达式是表达性的。除了风格之外,他们的表现有什么不同?
Declaration style | Expression-style
--------------------------------------+---------------------------------------------
where clause | let expression
arguments LHS: f x = x*x | Lambda abstraction: f = \x -> x*x
Pattern matching: f [] = 0 | case expression: f xs = case xs of [] -> 0
Guards: f [x] | x>0 = 'a' | if expression: f [x] = if x>0 then 'a' else ...
对于那些来到这个线程后,我发现了最好的解释,这里可以找到: “ Haskell 简介”。
表达式。
Haskell 的 let 表达式很有用 每当嵌套绑定集是 作为一个简单的例子, 考虑:
let y = a*b f x = (x+y)/y in f c + f d
由 let 创建的绑定集 表达式是相互递归的,并且 模式绑定被视为懒惰 模式(即它们带有一个隐含的 唯一的宣言 允许的是类型签名, 函数绑定和模式 束缚。
凡条款。
有时候进行范围调查是很方便的 绑在几个守卫上 这需要一个位置 子句:
f x y | y>z = ... | y==z = ... | y<z = ... where z = x*x
注意,这不能用 let 表达式来完成,因为 let 表达式只覆盖它所包含的表达式。Where 子句只能在一组方程式或大小写表达式的顶层使用。Let 表达式中绑定的相同属性和约束也适用于 where 子句中的绑定。这两种形式的嵌套作用域看起来非常相似,但是请记住,let 表达式是一个表达式,而 where 子句不是——它是函数声明和大小写表达式语法的一部分。