List 将字符串转换为整数列表,然后用haskell求和?
我有一个函数checkIfTrue,我想计算一个字符串并检查字符串的和是否为真。例如,我有一个字符串“ABC”,其中a=1,B=2,C=3 输入: 检查真实的“ABC”2 输出: 假的 A+B+C之和=6List 将字符串转换为整数列表,然后用haskell求和?,list,haskell,List,Haskell,我有一个函数checkIfTrue,我想计算一个字符串并检查字符串的和是否为真。例如,我有一个字符串“ABC”,其中a=1,B=2,C=3 输入: 检查真实的“ABC”2 输出: 假的 A+B+C之和=6 checkIfTrue :: String -> Int -> Bool checkIfTrue = sum x + xs .words | x <- A = 1 |x <- B = 2 |x <- C = 3 checkIfTrue:
checkIfTrue :: String -> Int -> Bool
checkIfTrue = sum x + xs .words
| x <- A = 1
|x <- B = 2
|x <- C = 3
checkIfTrue::String->Int->Bool
checkIfTrue=和x+xs.字
|Haskell中的xString
是[Char]
的类型同义词。你可以在这里利用这个优势
编写一个翻译Char->Int
的函数,然后将其映射到列表上:
stringValue :: String -> Int
stringValue s = sum $ map charToInt s
现在,您可以使用此函数以更简单的方式编写checkIfTrue
:
checkIfTrue :: String -> Int -> Bool
checkIfTrue s i = stringValue s == i
正如@karakfa在评论中所指出的,您可以使用映射'a'->1
的枚举
类型类编写一个简单的图表点
函数<代码>'Z'->26
:
charToInt :: Char -> Int
charToInt = (+1) . (subtract (fromEnum 'A') . fromEnum)
通过函数合成和eta缩减,整个过程可以压缩为一行:
checkIfTrue = (==) . sum . map (subtract (fromEnum 'A') . fromEnum)
你需要一个带签名的函数
:: 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
然后,您可以使用数据对字符串的映射进行求和
。可能
的catMaybes
忽略无
值。这可以用数据来概括。可能的映射可能::(a->mayb)->[a]->[b]
import Data.Maybe (catMaybes)
charVal :: Char -> Maybe Int
charVal 'A' = Just 1
charVal 'B' = Just 2
charVal 'C' = Just 3
charVal _ = Nothing
checkIfTrue :: String -> Int -> Bool
checkIfTrue s k = k == stringSum where
stringSum = sum . (mapMaybe charVal) $ s
如何设置每个字符的值?您可能需要类似于Data.Map.fromList$zip['A'..'Z'][1..]
的内容作为开始。(==)。总和映射(减去(从枚举'A')。从枚举)
@karakfa这看起来超级酷。我只是想知道Enum“A”的的时间复杂度。
应该是常数时间,我相信编译器会做正确的事情。上面的代码片段将A映射到0。为您的约定添加一个。如何指定A=1、B=2、C=3?@JayRowen,单个字符的模式匹配(如亚当·斯密的答案)就是解决问题的方法之一。另一个是使用karakfa在上面的评论中写的代码片段。@JayRowen您现在也可以查看我的更新答案。您也可以使用mapMaybe
而不是catMaybes。映射
使其更简单一点。@jkeuhlen谢谢!我自己还在学习Haskell,我回答这个标签问题的一半原因是为了学习新的stdlib函数来简化代码。那句老话是什么?要想得到一个问题的正确答案,最快的方法就是回答错误并加以纠正我也这么做了,但我和哈斯克尔的关系有点远<代码>地图可能
已经清理了我的许多代码!