如何在Either monad的上下文中使用Data.Map.lookup?

Lee*_*eeG 1 haskell either maybe

我正在尝试使用Data.Map将字符串映射到函数.我遇到的问题是我的程序中的主要错误处理使用了Either monad,Map.lookup并将返回Maybe ([SomeVal] -> Either ValError SomeVal).我怎样才能使Map.lookup在这种情况下,无论是单子发挥很好?

apply :: String -> [SomeVal] -> Either ValError SomeVal
apply s args = (Map.lookup s prims) >>= \fn -> fn args

prims :: Map String ([SomeVal] -> Either ValError SomeVal)
prims = Map.fromList
    [("key", function)
    ,("key2", function2)
    ]

::> apply "key" [val1, val2, val3]
Run Code Online (Sandbox Code Playgroud)

J. *_*son 8

Control.Error具有很好的功能

note :: e -> Maybe a -> Either e a
note e Nothing  = Left e
note _ (Just a) = Right a
Run Code Online (Sandbox Code Playgroud)

这对于"升级" Maybe类故障很有用Either.

lookupNote :: k -> Map.Map k v -> Either ValError v
lookupNote k = note (Missing k) . lookup k
Run Code Online (Sandbox Code Playgroud)

它也有很多人喜欢本作的变压器之间的映射Either,并Maybe和通用MonadPlus的实例.我强烈推荐那个包.


Ørj*_*sen 6

其他答案已经解释了如何Maybe变成Either一般.但是,Data.Map具体而言,Map.lookup您可以使用Map.findWithDefault,而不是包装,Maybe并允许您选择如何处理不存在的键.