将字符串转换为整数列表然后在haskell中求和它们?

时间:2017-11-13 21:01:42

标签: list haskell

我有一个函数checkIfTrue,我想计算一个字符串并检查字符串的总和是否为真。例如,我有一个字符串“ABC”,其中A = 1,B = 2,C = 3.让我们说

输入:

  

checkIfTrue“ABC”2

输出:

  

作为A + B + C = 6的总和。

checkIfTrue :: String -> Int -> Bool
checkIfTrue = sum x + xs .words 
    | x <- A = 1
    |x <- B = 2
    |x <- C = 3

这就是我的想法,但我不知道如何比较输入的总和是否相同。对不起,如果我的想法是荒谬的。

2 个答案:

答案 0 :(得分:2)

Haskell中的

String[Char]的类型同义词。你可以在这里利用这个优势!

编写一个翻译Char -> Int的函数,然后将其映射到您的列表中:

stringValue :: String -> Int 
stringValue s = sum $ map charToInt s 

现在您可以使用此功能以更简单的方式编写checkIfTrue

checkIfTrue :: String -> Int -> Bool 
checkIfTrue s i = stringValue s == i 

正如@karakfa在评论中所说,你可以编写一个简单的charToInt函数,利用Enum类型类来映射'A' -> 1 ... 'Z' -> 26:< / p>

charToInt :: Char -> Int
charToInt = (+1) . (subtract (fromEnum 'A') . fromEnum)

使用函数组合和eta-reduction可以将整个事物浓缩成单线:

checkIfTrue = (==) . sum . map (subtract (fromEnum 'A') . fromEnum)

答案 1 :(得分:2)

您需要一个带签名的功能

:: Char -> Int

或更可能

:: Char -> Maybe Int

因为域Char中只有3个值具有有效输出。你可以这样写:

charVal :: Char -> Maybe Int
charVal 'A' = Just 1
charVal 'B' = Just 2
charVal 'C' = Just 3
charVal _   = Nothing

然后,您可sum覆盖字符串的map,使用Data.Maybe的{​​{1}}忽略catMaybes值。这可以通过Nothing的{​​{1}}

进行推广
Data.Maybe