String 如何计算字符串列表中的整数。哈斯克尔

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

有一个字符串列表[“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) 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为基数?),我理解正确吗?只有非负整数还是也有负整数?是的。我想计算整数表示的字符串。它们可能是负面的