1
24
在Hakell语言中,where子句保存函数的局部定义。scala没有显式的where子句,但是可以通过在本地
本地'var'和'val`斯卡拉:
在Haskell:
局部“DEF”在斯卡拉
在Haskell
如果我在haskell示例中有任何语法错误,请更正我,因为我当前没有在此计算机上安装haskell编译器:)。 更复杂的例子可以通过类似的方式实现(例如使用模式匹配,这两种语言都支持)。本地函数具有 确切地 与任何其他函数的语法相同,只是它们的作用域是它们所在的块。 编辑 也见 Daniel 对这样一个例子的回答和对这个主题的一些阐述。
编辑2
:添加了关于的讨论
懒惰的'var'和'val`
Edward Kmett
他的回答正确地指出了哈斯克尔的where子句具有惰性和纯洁性。在scala中,您可以使用
在这里
如果不使用参数函数而使用惰性变量,则可以获得类似的结果。在上面的示例中,可以将
编辑3: 添加了有关范围界定的讨论,请参阅问题。 地方定义的范围
本地定义具有它们声明的块的范围,如预期的那样(大多数情况下,在
稀有的
它们可以逃离块的情况,比如在for循环中使用中间流变量绑定时)。因此当地
两个
还要注意,每个块必须以表达式结尾 不 因此,对于一个定义,不能将所有定义都放在块的末尾。我可能会将所有定义放在一个块的开头,然后在该块的末尾编写产生结果的所有逻辑。这样看起来更自然,而不是:
正如我之前所说,不能以
编辑4 :详细说明了使用后的定义,提示 Kim 的评论。 使用后定义“东西”
在一种有副作用的语言中实现这一点很困难。在一个纯粹的无副作用的世界里,秩序并不重要(方法不依赖于任何副作用)。但是,由于scala允许副作用,定义函数的位置
做
物质。此外,当您定义
但是,如果
此示例还很好地显示了工作时的缓存(尝试更改
我仍然认为在一个有副作用的世界里,最好坚持定义 之前 你用它们。这样更容易读取源代码。
|
2
5
类似的,是的。我不会细说,因为 Flaviu 已经有了,但我会举一个维基百科的例子。 Haskell:
这些定义只是本地定义
因为scala没有等价的
斯卡拉没有
现在,haskell的定义更加紧凑,原因有很多:
所以,scala做它所做的有各种各样的原因,尽管我喜欢一个隐式模式匹配定义。-) |
3
4
你可以使用
哈斯克尔
这意味着您可以编写一个很长的本地定义,并删除
不幸的是,scala没有这些属性,因此不能提供与haskell的完全等效的
你需要手动计算出
|
4
3
哈斯克尔
绑定
名称的值
斯卡拉
编码
绑定与
本着规范化的精神
实例使用:
我感觉到你的痛苦。如果我做了一个有效的宏,我会回复你的。 |
Nezir · WHERE and子句不返回值 6 年前 |
NormX · 在窗体访问上打印预览到当前记录 7 年前 |
fishy101 · where子句中的差异-in和not in 7 年前 |