Haskell 如何在任意一个monad的上下文中使用Data.Map.lookup?
我正在尝试使用Data.Map将字符串映射到函数。我遇到的问题是,我的程序中的主要错误处理使用了非此即彼的monad和Haskell 如何在任意一个monad的上下文中使用Data.Map.lookup?,haskell,maybe,either,Haskell,Maybe,Either,我正在尝试使用Data.Map将字符串映射到函数。我遇到的问题是,我的程序中的主要错误处理使用了非此即彼的monad和映射。查找将返回Maybe([SomeVal]->非此即彼的valeror-SomeVal)。在这种情况下,如何使Map.lookup能够很好地使用任一monad apply :: String -> [SomeVal] -> Either ValError SomeVal apply s args = (Map.lookup s prims) >>= \
映射。查找
将返回Maybe([SomeVal]->非此即彼的valeror-SomeVal)
。在这种情况下,如何使Map.lookup
能够很好地使用任一monad
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]
这取决于您希望如何处理
Nothing
案例。如果你想断言钥匙永远在那里(一个坏主意)
但更聪明的方法是在什么都找不到的情况下有一个合理的价值。您可能需要一些valeror
构造函数
ValError = ...
| NoKey String
...
apply s args = maybe (Left $ NoKey s) ($args) $ M.lookup s prims
或者只想保留也许
apply :: String -> [SomeVal] -> Maybe (Either ValError SomeVal)
在找不到密钥的情况下,这两种方法都提供了更合理的语义。您选择的主要是首选项,如果您打算使apply
成为API的一个非常基本的部分,以便valeror
s应该了解它,那么1就非常有用
否则,2使用起来更痛苦,但不需要更改任何令人愉快的现有代码。这取决于您希望如何处理
Nothing
情况。如果你想断言钥匙永远在那里(一个坏主意)
但更聪明的方法是在什么都找不到的情况下有一个合理的价值。您可能需要一些valeror
构造函数
ValError = ...
| NoKey String
...
apply s args = maybe (Left $ NoKey s) ($args) $ M.lookup s prims
或者只想保留也许
apply :: String -> [SomeVal] -> Maybe (Either ValError SomeVal)
在找不到密钥的情况下,这两种方法都提供了更合理的语义。您选择的主要是首选项,如果您打算使apply
成为API的一个非常基本的部分,以便valeror
s应该了解它,那么1就非常有用
否则,2使用起来会更痛苦,但不需要更改任何令人愉快的现有代码。具有很好的功能
note :: e -> Maybe a -> Either e a
note e Nothing = Left e
note _ (Just a) = Right a
这对于将类似于的故障“升级”到类似于的故障非常有用
lookupNote :: k -> Map.Map k v -> Either ValError v
lookupNote k = note (Missing k) . lookup k
它还有许多类似于这样的方法,用于在或和可能的转换器与通用MonadPlus
实例之间进行映射。我强烈推荐这个软件包。的功能很好
note :: e -> Maybe a -> Either e a
note e Nothing = Left e
note _ (Just a) = Right a
这对于将类似于
的故障“升级”到类似于
的故障非常有用
lookupNote :: k -> Map.Map k v -> Either ValError v
lookupNote k = note (Missing k) . lookup k
它还有许多类似于这样的方法,用于在或和可能的转换器与通用MonadPlus
实例之间进行映射。我强烈推荐该软件包。其他答案解释了如何将Maybe
转换为或。但是,对于Data.Map
,您可以使用Map.lookup
,而不是Map.findWithDefault
,它不包含在Maybe
中,允许您选择如何处理不存在的键。其他答案解释了如何将Maybe
转换为或。但是对于Data.Map
特别是,您可以使用Map.lookup
,而不是Map.findWithDefault
,它不封装在Maybe
中,允许您选择如何处理不存在的键。我认为这在将来会非常有用,但是Map.findWithDefault我认为是处理这个问题的最干净的方法。我认为这在将来会非常有用,但是Map.findWithDefault我认为是处理这个问题的最干净的方法。我喜欢这里的第二种情况:可能是一个棘手的小函数。。。很高兴我现在知道了。我喜欢这里的第二个例子:可能是一个棘手的小函数。。。很高兴我现在知道了。