Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 将字符串转换为整数列表,然后用haskell求和?_List_Haskell - Fatal编程技术网

List 将字符串转换为整数列表,然后用haskell求和?

List 将字符串转换为整数列表,然后用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,我想计算一个字符串并检查字符串的和是否为真。例如,我有一个字符串“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::String->Int->Bool
checkIfTrue=和x+xs.字

|Haskell中的x
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在评论中所指出的,您可以使用映射
'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函数来简化代码。那句老话是什么?要想得到一个问题的正确答案,最快的方法就是回答错误并加以纠正我也这么做了,但我和哈斯克尔的关系有点远<代码>地图可能
已经清理了我的许多代码!