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 || 救援|| 处理代码.
处理事物的功能方法是在执行操作之前检查输入,如果输入与所需条件不匹配则返回"无".选项类型是处理错误的轻量级.
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代码,因为共享接口不存在.