gpt4 book ai didi

haskell - Monad 只是错误处理的一种功能方式吗?

转载 作者:行者123 更新时间:2023-12-01 09:13:59 25 4
gpt4 key购买 nike

我正在阅读“在 Haskell 中编程”一书,并试图将 Haskell 的想法与我在 C# 中的知识联系起来。如果我错了,请纠正我。

我觉得 monads 强制程序员编写可以处理异常的代码。所以我们会明确提到类型系统中的错误处理,比如

Optional(Int) functionName(Int a, Int b)

返回类型是 Optional(Int) 但不是 Int,所以曾经使用过具有这种返回类型的库的人会理解正在发生错误处理,结果将类似于 None(解释出了什么问题)和 Some(解释说我们得到了一些结果)。

任何代码都可能导致快乐路径(我们得到一些结果)和悲伤路径(发生错误的地方)。在类型系统中显式地制作这条路径就是 monad。这就是我对它的理解。请纠正我。

Monad 就像是纯函数式编程和不纯代码(会产生副作用)之间的桥梁。

除此之外,我想确保我对异常处理 (VS) 选项类型的理解。

异常处理尝试在不深入了解输入的情况下执行操作。异常处理很重,因为调用堆栈必须展开直到它到达 Catch ||救援 ||处理代码。

处理事情的函数式方法是在执行操作之前检查输入,如果输入不符合要求的标准,则返回“无”作为结果。选项类型是处理错误的轻量级。

最佳答案

Monad只是一个类型可以实现的接口(interface)(在 Haskell 术语中,typeclass),以及指定接口(interface)应该如何行为的一些限制的协定。

这与 C# 类型 T 的方式没有什么不同。可以实现,比如说,IComparable<T>界面。但是,Monad接口(interface)是相当抽象的,并且函数可以为不同的类型做令人惊讶的不同事情(但总是尊重相同的规律,以及相同的组合“ flavor ”)。

而不是看到 Monad作为一种功能性的错误处理方式,最好采用另一种方式:发明一个像 Optional 这样的类型。表示错误/缺少值,并开始在该类型上设计有用的功能。例如,产生“有人居住”Optional 的函数从现有值,一个由两个 Optional 组成的函数-返回函数以最小化重复代码,该函数更改 Optional 中的值如果存在,以此类推。所有这些功能都可以单独使用。

在我们有了类型和一系列有用的函数之后,我们可能会问自己:

  • 类型本身是否符合 Monad 的要求? ?例如,它必须有一个类型参数。
  • 做一些(不一定是全部)我们发现的适合 Monad 类型的有用函数界面?他们不仅必须符合签名,而且必须符合契约(Contract)。

  • 在肯定的情况下,好消息!我们可以定义一个 Monad类型的实例,现在我们可以使用很多 monad-generic functions免费!

    但即使 Monad typeclass 在我们的语言中不存在,我们可以记住,类型和在其上定义的一些函数的行为类似于 Monad .来自 documentationthenCompose CompletableFuture 的方法Java类:

    This method is analogous to Optional.flatMap and Stream.flatMap.



    这允许我们在看似不相关的类之间“传递直觉”,即使我们不能编写单子(monad)通用代码,因为共享接口(interface)不存在。

    关于haskell - Monad 只是错误处理的一种功能方式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49585096/

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