gpt4 book ai didi

haskell - 如果 Haskell 纯粹是功能性的,为什么它可以在 Haskell 中休眠/暂停执行?

转载 作者:行者123 更新时间:2023-12-03 11:07:12 27 4
gpt4 key购买 nike

我看到 Haskell 有一个叫做“延迟”的 sleep 函数:Control.Concurrent.Thread.Delay

我的问题是:如果 Haskell 纯粹是功能性的,怎么可能有这样的东西? sleep 不是附带效应还是我错过了什么?

最佳答案

好的,将我的评论移至答案。请注意 IO 有多个 View 。 monad 和这些想法。您可以使用唯一性类型等获得类似的结果。

我只是碰巧发现这是最简单和最酷的解释。

假装杂质

Haskell 是一种纯粹的函数式语言。这应该意味着评估一个 Haskell 程序应该总是产生相同的结果。然而,情况似乎并非如此!看看类似的东西

-- Echo.hs
main :: IO ()
main = getLine >>= putStrLn

根据用户输入,这似乎会有所不同。

真正生活在 IO 中的任何东西看起来它可以根据从月球状态到薛定谔猫的人寿保险费用的所有事情做完全不同的事情。

此外,似乎任何可以做任何有用的语言都必​​须是不纯的。除非你有兴趣观看你的 CPU 旋转,否则程序的存在就是为了产生副作用!

邪恶的口译员

事实上,事实并非如此!适当的心智模型是想象 IO就像
data IO a = PutStrLn String a
| GetLine (String -> a)
...

所以 IO可能只是一个数据结构,表示程序要执行的一种“计划”。然后邪恶的不纯 Haskell 运行时实际上执行了这个计划,产生了你看到的结果。

不过,这不仅仅是一个轻微的语义问题,我们可以做类似的事情
runBackwards :: [IO ()] -> IO ()
runBackwards = foldr (>>) (return ()) . reverse

换句话说,我们可以将我们的“计划”作为正常的、一流的值(value)观来操纵。

我们可以评估他们,强制他们,向他们扔一大堆砖头,甚至在他们背后说他们的坏话,他们永远不会产生副作用!他们看不到,普通的 Haskell 代码只能建立 IO要由运行时评估的 Action ,它无法做任何明显的事情。

在某种程度上,您几乎可以将 Haskell 程序视为元编程的终极形式,在运行时动态生成程序并让某些解释器对它们进行评估。

所以当你说
 foo = delay 20

您不是说“将此程序延迟 20 次”,而是说“在此代码构建的程序中,在运行时暂停其执行 20 次”。

谁在乎

问“谁在乎”是公平的:如果这段代码在某个时候运行,谁在乎谁运行它?以这种方式纯功能性有什么好处?它实际上可以产生一些有趣的效果(呵呵)。

例如,想像 http://www.tryhaskell.org 这样的东西。 ,显然它需要运行Haskell代码,但它也不能盲目地执行任何 IO它得到了!它可以做的是提供 IO 的不同实现。 ,同时公开相同的 API。

这个新的 IO构建了一个像数据结构一样漂亮的树,它可以很容易地被 Web 后端清理和检查,以确保它永远不会运行邪恶的东西。我们甚至可以编译我们的假- IO结构为 GHC 提供的正常结构,并在服务器上有效地执行它!因为从一开始就没有任何邪恶之处,我们只需要相信我们编写的代码。

不再有无尽的小程序式安全漏洞。通过替换 IO我们毫无疑问地知道我们可以执行此代码,并且它永远不会尝试做坏事。

到处都是邪恶的口译员

事实上,这种建立数据结构的概念不仅仅适用于 IO。 .这是构建任何旨在提供有限 DSL 的项目的好方法。任何来自
  • 一种查询语言
  • 游戏脚本
  • 代码生成
  • 写“客户端haskell”

  • 所有这些都可以通过建立正常的数据结构并将它们“编译”成适当的语言来解决。通常的技巧是使用 free monad .如果你是中级 Haskeller,去了解一下吧!

    关于haskell - 如果 Haskell 纯粹是功能性的,为什么它可以在 Haskell 中休眠/暂停执行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25576184/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com