我有以下代码(使用Haskell Prelude中的查找):
al :: [(Char, Int)]
al = [("A", 1),
("B", 2),
("C", 3),
...
]
strToInt :: [Char] -> Int
strToInt []
= 0
strToInt (c:cs)
= lookup c al + strToInt cs
问题是我试图在编译器不允许的Maybe Int
和Int
上执行添加。我该如何解决这个问题?
答案 0 :(得分:2)
在这种情况下,由于您要将值一起添加,并且忽略Nothing
值(即将它们视为0
)是很自然的,您也可以使用{{mapMaybe
来编写函数。 1}}:
import Data.Maybe (mapMaybe)
al :: [(Char, Int)]
al = [('A', 1), ('B', 2), ('C', 3)]
strToInt :: String -> Int
strToInt = sum . mapMaybe (`lookup` al)
GHCI:
*Q46515794> strToInt "AB"
3
*Q46515794> strToInt "AC"
4
*Q46515794> strToInt "ABC"
6
答案 1 :(得分:1)
如果前提条件是查找始终成功,请使用fromJust :: Maybe a -> a
来解析值 - 例如fromJust (lookup c al)
。
否则,您需要一些'默认'在查找失败的情况下返回的值(例如0
)。然后,您可以使用fromMaybe :: a -> Maybe a -> a
,它将默认值作为第一个参数并解析该值 - 例如,fromMaybe 0 (lookup c a1)
。
答案 2 :(得分:1)
我猜你必须控制你的逻辑。当您提供的字符返回Nothing
时,您不知道自己想要什么,此函数最好返回Maybe
类型。
如果您想将Nothing
视为0
,那么mapMaybe
是一种方法。或者,如果您想要Maybe
类型的结果,那么......
al :: [(Char, Int)]
al = [('A', 1), ('B', 2), ('C', 3), ('D', 4)]
strToInt :: [(Char, Int)] -> String -> Maybe Int
strToInt ts cs = foldr (\c m -> (+) <$> (lookup c ts) <*> m) (Just 0) cs
*Main> strToInt al "AJN"
Nothing
*Main> strToInt al "ABCD"
Just 10