Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 如何在任意一个monad的上下文中使用Data.Map.lookup?_Haskell_Maybe_Either - Fatal编程技术网

Haskell 如何在任意一个monad的上下文中使用Data.Map.lookup?

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) >>= \

我正在尝试使用Data.Map将字符串映射到函数。我遇到的问题是,我的程序中的主要错误处理使用了非此即彼的monad和
映射。查找
将返回
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我认为是处理这个问题的最干净的方法。我喜欢这里的第二种情况:可能是一个棘手的小函数。。。很高兴我现在知道了。我喜欢这里的第二个例子:可能是一个棘手的小函数。。。很高兴我现在知道了。