String 如何计算字符串列表中的整数。哈斯克尔
有一个字符串列表[“f”、“1”、“h”、“6”、“b”、“7”] 如何计算此列表中的Int 现在我有了这个算法,但不是很好String 如何计算字符串列表中的整数。哈斯克尔,string,list,haskell,String,List,Haskell,有一个字符串列表[“f”、“1”、“h”、“6”、“b”、“7”] 如何计算此列表中的Int 现在我有了这个算法,但不是很好 import Data.Char let listOfStrings = ["f", "1", "h", "6", "b", "7"] let convertedString = "f1h6b7" let listOfInt = map (\x -> read [x]::Int) (filter (\x -> isDigit x) convertedStrin
import Data.Char
let listOfStrings = ["f", "1", "h", "6", "b", "7"]
let convertedString = "f1h6b7"
let listOfInt = map (\x -> read [x]::Int) (filter (\x -> isDigit x) convertedString)
length listOfInt
Prelude> 3
此外,我不能将listofstring转换为一个字符串。这个算法甚至不能正常工作
你能帮我优化一下吗?
concat
连接多个列表,因此concat-listOfStrings
将产生“f1h6b7”
。
如果您只想计算正整数,您可以尝试以下方法
countInts (x:xs) = if isDigit x then 1 + countInts xs else countInts xs
其中(x:xs)
是一个列表的模式,该列表的头元素x
,尾元素xs
。(这适用于convertedString
,因为它是字符列表[Char]
,但不适用于listofstring
,因为它实际上是[String]
,可以扩展为[[Char]]
)
你得到的实际输入是什么listofstring
或convertedString
?1)使用reads::reads Int
(此表达式只是reads::String->[(Int,String)]
来测试字符串是否是整数值的表示:
isNumber :: String -> Bool
isNumber s = case (reads s) :: [(Int, String)] of
[(_, "")] -> True
_ -> False
为什么??因为它返回有关解析过程的附加信息,从中我们可以推断解析是否成功read::Int
只会引发异常
2) 然后使用它筛选字符串列表并获取其长度:
intsCount :: [String] -> Int
intsCount = length . filter isNumber
基本原则是
- 对具有给定属性的列表中的项进行计数
Prelude
函数很容易解决这个问题:
countItemsWith :: (a -> Bool) -> [a] -> Int
countItemsWith property list = length $ filter property list
剩下的就是找到一个好的表达式来确定字符串是否是整数的表示形式。我们可以编写自己的测试,但我们也可以为此重复使用Prelude
函数
isIntegerRepresentation :: String -> Bool
isIntegerRepresentation s = case reads s :: [(Integer,[Char])] of
[(_,"")] -> True
_ -> False
您的代码可以重写为:
import Data.Char
let listOfStrings = ["f", "1", "h", "6", "b", "7"]
let convertedString = concat listOfStrings
let listOfInts = map digitToInt (filter isDigit convertedString)
length listOfInts
Prelude> 3
要从字符串列表变为单个字符串,只需使用concat
。Concat获取一个列表列表,并返回一个列表,列表中的所有元素都在后面,并且由于字符串是Char
s的列表,Concat
在本例中获取Char
的列表,并返回一个Char
的列表(也称为字符串)
过滤器从使用\x->isDigit x
简化为只使用isDigit
。这是完全相同的函数
我用digitToInt
而不是\x->read[x]::Int
请注意,如果只想在convertedString
中查找位数,可以执行以下操作:
let listOfDigits = filter isDigit convertedString
length listOfDigits
Prelude> 3
我相信对你来说最好的答案是
import Data.List (foldl')
import Data.Char (isNumber)
countNumb l = foldl' (\x y -> x+1) 0 (filter isNumber l)
在这里,我们检查char是否为number并对其进行计数
注:这将适用于['f','1','h','6','b','7']
我发现使用fromEnum
将布尔值转换为0或1通常很有用:
import Data.Char
countInts = sum . map (fromEnum . isNumber) . concat
您想计算列表中表示整数的字符串
s(以10为基数?),我理解正确吗?只有非负整数还是也有负整数?是的。我想计算整数表示的字符串。它们可能是负面的