No código funciona bem como abaixo
divide :: Int -> Int -> Either String Int
divide a 0 = Left "Error with 0"
divide a b = Right (a `div` b)
O código a ser alterado
Map.adjust (divide 3) "A" $ Map.fromList [("A",3),("B",0)]
O resultado esperado deve ser:
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"
Ou em geral como construir uma função como:
Map.adjust:: (a -> m a) -> k -> (Map k a) -> m (Map k a)
Muito obrigado !
Uma função
adjustM
com tipo(a -> m a) -> k -> (Map k a) -> m (Map k a)
pode ser definida sobre a função já existentealterF :: (Functor f, Ord k) => (Maybe a -> f (Maybe a)) -> k -> Map k a -> f (Map k a)
.alterF
é mais geral porque, além de permitir efeitos, também permite remover o valor alvo ou inseri-lo quando a chave ainda não existe. (É para isso queMaybe
servem os s na assinatura).Ou, mais sucintamente,
Podemos implementar isso usando
insert
:Portanto, primeiro verificamos se a chave existe, se existir, executamos
f v
e então usamos isso para inserir o novo valor nomap
.Isso gera o resultado esperado: