我从概念上理解了所有这些,我只是希望了解如何在ML和Haskell中实现它们的一些代码示例。如何在ml和haskell中实现静态范围,动态范围和懒惰评估?
回答
Haskell变量(顶层定义,模式中的变量等)都是静态范围的。例如,程序:
y = "global value"
f = print y
g = let y = "local value" in f
main = g
将打印“全局值”。即使在g
的定义中,函数f
在“重新定义”y
之后使用,但此重新定义不影响f
的定义,该定义使用有效的y
的静态(AKA词汇)范围定义,其中f
已定义。
如果你想“实施”动态范围,你必须更具体地说明你的意思。如果你想知道,如果你能在普通的Haskell写一个函数,如:
addY :: Int -> Int
addY x = x + y
这样y
可能是指不同的变量从一个调用到下一个,那么答案是否定的。在这个定义中,y
总是指向同一个变量(在Haskell中,它指的是相同的,不可变的值),它可以通过对程序的静态分析来确定,并且不能动态重新定义。
[[编辑:正如@Jon Purdy指出的那样,有一个Haskell扩展支持一种动态范围的形式,以下列举使用相同函数打印各种动态范围的本地值。
{-# LANGUAGE ImplicitParams #-}
f :: (?y :: String) => IO()
f = print ?y
g = let ?y = "g's local value" in f
h = let ?y = "h's local value" in f
main = do
g -- prints g's local value
h -- prints h's local value
let ?y = "main's local value" in f -- prints main's value
的edit--]
对于惰性计算--end,有许多例子,如下面进入到交互式GHCI会话:
take 3 [1,2..] -- gives [1,2,3]
let x = (15^2, 6 `div` 0)
fst x -- gives 225
let y = snd x
y -- *** Exception: divide by zero
在第一行,如果评估是严格的,那么试图完全评估无限列表[1,2..]
(也可以写成[1..]
- 只需向上计数1,2,3,...永远)将进入无限循环,并且take
函数会永远不会被调用。在第二个例子中,如果评估是严格的,当定义x
时,不仅在我们试图打印其第二个组件之后,会发生除零错误。
动态范围变量有一个扩展:'ImplicitParams'。例如,如果你有'pr ::(?currentOutputHandle :: Handle,Show a)=> a - > IO(); pr x = hPrint?currentOutputHandle x',那么你可以用例如本地重定向输出。 'let?currentOutputHandle =在pr“foo”'中的stderr。 –
你是对的!几个小时前我只是在看这个扩展而没有建立连接。 –
- 1. 动态作用域和静态范围
- 2. C#静态类和范围
- 3. Rails中的懒惰范围
- 4. 范围和评估说明
- 5. 关闭和动态范围?
- 6. Fsharp - 范围评估
- 7. 动态范围
- 8. 在Haskell中演示懒惰评估?
- 9. 懒惰的评估和严格的评估Haskell
- 10. 静态范围VS动态作用域
- 11. 评估范围在Access VBA
- 12. 静态单对象和其范围的
- 13. 本征和懒惰评估
- 14. 流和懒惰评估
- 15. Typescript ESDoc如何评估评论范围?
- 16. 在Excel中将静态日期范围更改为动态日期范围
- 17. 动态范围内的VBA范围值
- 18. 名单懒惰评估在Haskell
- 19. AS3:静态范围问题
- 20. VBA:Protection.AllowEditRanges动态范围
- 21. 动态和静态范围程序差异
- 22. 问题关于静态和动态范围界定问题
- 23. IP范围从和IP范围到 - 动态文本框
- 24. 如何存储和评估表驱动范围规则
- 25. 如何实现静态项目范围的偏好系统?
- 26. 懒惰的范围内反复强调
- 27. 静态类构造函数和静态类字段的范围
- 28. 何时在Rails中使用动态查找器与范围和范围方法?
- 29. 静态范围内的活动联盟
- 30. 猫鼬和懒惰初始化属性在正确的范围
“执行”是什么意思?你是否希望自己的代码示例具有静态作用域,动态作用域或惰性评估,还是希望以ml或Haskell实现具有这些功能的解释器?无论哪种情况,这个问题都有点宽泛。 – Alec
http://okmij.org/ftp/Computation/dynamic-binding.html – coredump
@Alec第一个选项 –