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

Paw*_*mar 3 monads haskell option-type

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

我觉得monad强制程序员编写可以处理异常的代码.所以我们将明确提到类型系统中的错误处理

Optional(Int) functionName(Int a, Int b)
Run Code Online (Sandbox Code Playgroud)

返回类型是Optional(Int)但不是Int,所以谁曾经使用具有这种返回类型的库将理解错误处理正在发生,结果将像None(解释出错)和Some(解释我们得到了一些结果).

任何代码都可以导致Happy Path(我们得到一些结果)和Sad Path(发生错误).在类型系统中明确地创建这个路径就是monad.这是我对它的理解.请指正.

Monads就像是Pure Functional Programming和Impure代码之间的桥梁(导致副作用).


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

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

处理事物的功能方法是在执行操作之前检查输入,如果输入与所需条件不匹配则返回"无".选项类型是处理错误的轻量级.

dan*_*iaz 5

Monad 只是一个类型可以实现的接口(在Haskell术语,类型类中),以及一个指定接口应该如何表现的限制的契约.

它与C#类型T如何实现(例如,IComparable<T>接口)没有什么不同.然而,Monad界面是相当抽象的,并且函数可以针对不同类型做出令人惊讶的不同事物(但始终遵循相同的规律,以及相同的"组合风味").

而不是将其Monad视为错误处理的功能方式,最好采用另一种方式:发明类似的类型Optional表示错误/缺少值,并开始在该类型上设计有用的函数.例如,一个Optional从现有值产生"居住" 的函数,一个组成两个Optional返回函数以最小化重复代码的函数,一个改变Optional其存在内部值的函数,等等.所有这些功能都可以自己使用.

我们拥有类型和一系列有用的功能之后,我们可能会问自己:

  • 类型本身是否符合要求Monad?例如,它必须具有类型参数.

  • 难道一些的,我们已经发现了该类型的有用的功能(不一定是所有)符合Monad接口?他们不仅必须符合签名,还必须符合合同.

在肯定的情况下,好消息!我们可以Monad为类型定义一个实例,现在我们可以免费使用大量的monad-generic函数!

但是即使Monad我们的语言中不存在类型类,我们也可以记住,它上面定义的类型和一些函数的行为类似于Monad.从Java类的方法的文档:thenComposeCompletableFuture

此方法类似于Optional.flatMap和Stream.flatMap.

这允许我们在看似无关的类之间"转移直觉",即使我们不能编写monad-generic代码,因为共享接口不存在.