在代码中它运行良好,如下所示
divide :: Int -> Int -> Either String Int
divide a 0 = Left "Error with 0"
divide a b = Right (a `div` b)
要更改的代码
Map.adjust (divide 3) "A" $ Map.fromList [("A",3),("B",0)]
预期结果应该是:
Map.adjust (divide 3) "A" $ Map.fromList [("A",3),("B",0)]
=> Right $ Map.fromList [("A",1),("B",0)]
Map.adjust (divide 3) "B" $ Map.fromList [("A",3),("B",0)]
=> Left "Error with 0"
或者一般来说如何构建如下函数:
Map.adjust:: (a -> m a) -> k -> (Map k a) -> m (Map k a)
非常感谢 !
可以在已经存在的函数之上定义
adjustM
具有类型的函数。(a -> m a) -> k -> (Map k a) -> m (Map k a)
alterF :: (Functor f, Ord k) => (Maybe a -> f (Maybe a)) -> k -> Map k a -> f (Map k a)
alterF
更为通用,因为除了允许效果之外,它还允许您删除目标值,或者在键不存在时插入它。(这就是Maybe
签名中的那些 s 的用途)。或者更简洁地说,
我们可以使用
insert
以下方法来实现:因此,我们首先检查键是否存在,如果存在则运行
f v
,然后使用该键在中插入新值map
。这将产生预期的结果: