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的liftMaybe的元素转换为它们的一般Monad对应元素,因此也许应该将其命名为convertgeneralize或其他名称;-)

如果您只想主要在列表推导和其他实现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/

10-11 22:35
查看更多