gpt4 book ai didi

haskell - "error"函数的存在如何影响 Haskell 的纯度?

转载 作者:行者123 更新时间:2023-12-04 09:58:19 25 4
gpt4 key购买 nike

我一直想知道 Haskell 异常系统如何与整个“纯函数式语言”相适应。例如,请参阅下面的 GHCi session 。

GHCi, version 8.0.1: http://www.haskell.org/ghc/  :? for help
Prelude> head []
*** Exception: Prelude.head: empty list
Prelude> :t head
head :: [a] -> a
Prelude> :t error
error :: [Char] -> a
Prelude> error "ranch"
*** Exception: ranch
CallStack (from HasCallStack):
error, called at <interactive>:4:1 in interactive:Ghci1
Prelude>

头部的类型是 [a] -> a。但是当你在空列表的特殊情况下调用它时,你会得到一个异常。但是在类型签名中没有考虑到这个异常。

如果我没记错的话,当模式匹配失败时,这是一个类似的故事。类型签名说什么并不重要,如果你没有考虑到所有可能的模式,你就有抛出异常的风险。

我没有一个简洁的问题要问,但我的脑袋在游泳。将这个奇怪的异常系统添加到原本纯粹而优雅的语言中的动机是什么?它仍然是纯净的,但我只是错过了一些东西吗?如果我想利用这个异常特性,我将如何去做(即我如何捕获和处理异常?我还能用它们做些什么吗?)例如,如果我编写的代码使用“头”功能,我当然应该对空列表以某种方式走私的情况采取预防措施。

最佳答案

您混淆了两个概念:纯度和整体性。

  • Purity 说功能没有副作用。
  • Totality 表示每个函数都会终止并产生一个值。

  • Haskell 是纯粹的,但不是完全的。
    IO 之外, nontermination (e.g., let loop = loop in loop) 和 exceptions (e.g., error "urk!") 是相同的——非终止项和异常项在强制时不会计算为值。 Haskell 的设计者想要一种图灵完备的语言,根据停机问题,这意味着他们放弃了整体性。一旦你有非终止,我想你也可能有异常(exception)——定义 error msg = error msg并调用 error在实践中,永远什么都不做比在有限时间内实际看到您想要的错误消息更不令人满意!

    不过,一般来说,你是对的——部分函数(那些没有为每个输入值定义的函数,比如 head )是丑陋的。现代 Haskell 通常更喜欢通过返回 Maybe 来编写总函数。或 Either值,例如
    safeHead :: [a] -> Maybe a
    safeHead [] = Nothing
    safeHead (x:_) = Just x

    errHead :: [a] -> Either String a
    errHead [] = Left "Prelude.head: empty list"
    errHead (x:_) = Right x

    在这种情况下, Functor , Applicative , Monad , MonadError , Foldable , Traversable 等,机器使这些总功能的组合和使用它们的结果变得容易。

    如果您真的在代码中遇到异常——例如,您可以使用 error检查代码中您认为已强制执行但有错误的复杂不变量 - 您可以在 IO 中捕获它.这又回到了为什么可以与 IO 中的异常交互的问题。 ——这不会使语言不纯吗?答案与 IO 中为什么我们可以做 I/O 的问题的答案相同。 , 或使用可变变量 - 评估 IO A 类型的值不会产生它描述的副作用,它只是描述程序可以做什么的 Action 。 (互联网上其他地方对此有更好的描述;异常(exception)与其他效果没有任何不同。)

    (另外,请注意有 a separate-but-related exception system in IO ,例如在尝试读取不存在的文件时使用。人们通常可以适度使用这个异常系统,因为因为你在 IO 你'已经在使用不纯的代码了。)

    关于haskell - "error"函数的存在如何影响 Haskell 的纯度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40076851/

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