我有一个函数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
这就是我的想法,但我不知道如何比较输入的总和是否相同。对不起,如果我的想法是荒谬的。
答案 0 :(得分:2)
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