haskell - 单子和liftM
问题描述
我在使用liftM
. 因为(+)
它工作正常,该函数
madd a b = liftM2 (+) a b
给了我预期的结果Just 5 `madd` Just 7 = Just 12
,但现在尝试它(/)
给了我奇怪的结果。
mdiv a b = liftM2 (/) a b
现在手术
在我期待的时候Just 12 `mdiv` Just 0
给了我。Just Infinity
Nothing
解决方案
Monad 不是魔法,它们只是封装了某些计算模式。
liftM2 :: Monad m => (a -> b -> c) -> m a -> m b -> m c
以及Maybe
monad 的特定版本,
liftM2 :: (a -> b -> c) -> Maybe a -> Maybe b -> Maybe c
这里没有关于数字和被零除错误的内容。我们在这里只知道一元值是Just something
还是Nothing
。
这允许我们定义一个安全的除法函数,但它不会自己为我们所有人做这件事。
Haskell 不是智能代码编写 AI 代理。它只是另一种编程语言,由程序员而不是计算机编写程序。此外,它为什么要为您决定是否希望发生运行时除零错误!
推荐阅读
- pythonanywhere - 在 pythonanywhere 中使用 ntplib 时,谁能解释这个错误?
- javascript - 通过 FileReader 读取本地 csv 文件,传递给 d3.csvParse
- html - 悬停离开后CSS没有平滑淡入
- python - 在 python 2.7 中覆盖 SIGTERM isr 在 Windows 7 中不起作用
- c# - 如何在 C# 中创建用于访问对象属性的接口?
- html - 如何创建 ccs 下拉菜单?
- java - 在 couchbase 上发生服务器故障时更新 CAS 值
- azure-devops - Azure Devops Rest Api 获取团队当前 Sprint 的工作项和任务
- python - Python-'自动化无聊的东西'-while循环
- swift - 将 CollectionDifference 应用于 NSTableView