Haskell对查找调用的返回值进行操作

时间:2017-10-01 18:58:39

标签: haskell

我有以下代码(使用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 IntInt上执行添加。我该如何解决这个问题?

3 个答案:

答案 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