Data.Map和Data.IntMap中的查找函数当前返回包装在Maybe中的值,其中包含
类型签名
lookup :: Ord k => k -> Map k a -> Maybe a
它曾经有更一般的类型
lookup :: (Monad m, Ord k) => k -> Map k a -> m a
我意识到前者可能会减少对额外类型规范的需求,但后者会使它更加通用,并允许在列表推导中使用查找。有什么办法可以模仿较新版本的行为,还是我必须使用旧版本的库?
最佳答案
Don的lift
将Maybe
的元素转换为它们的一般Monad
对应元素,因此也许应该将其命名为convert
或generalize
或其他名称;-)
如果您只想主要在列表推导和其他实现lookup
的monad中使用fail
,则还可以利用模式匹配失败到fail
的映射:
前奏> [v |只是v []
前奏> [v |只是v [“银”]
Prelude> do Just v ***异常(exception):用户错误(在:1:3-8处的do表达式中模式匹配失败)
Prelude> do Just v “银”
关于Haskell map 返回单子(monad),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3030767/