在Haskell中计算具有多个数字的数字的函数

时间:2014-03-13 19:21:57

标签: haskell

我正在尝试编写一个函数来计算Haskell中超过1位数的字符串中的所有数字。

示例1:“Test1 Test12”

这应该返回1,因为只有“Test12”有超过1位数。

实施例2:“Test1 Test12 Test123”

这应该返回2,因为只有“Test12”和“Test123”有超过1位数。

这就是我的代码目前的样子:

import Data.Char
import Data.List
import Data.Function

digits = any ((1<) . length) . groupBy ((&&) `on` isDigit)

count :: String -> Int 
count n = length (filter digits n)

有人可以帮我吗?

1 个答案:

答案 0 :(得分:2)

您的问题可以分解为

  • 我想计算一个字符串中包含多个数字
  • 的字数
  • 我想找到一个字符串中包含多个数字
  • 的单词
  • 我想确定一个单词是否有多个数字
  • 我想计算单词中的位数

因此,您要做的最基本的事情是计算单词中的位数。由于单词是一个字符串,可以通过

轻松完成
count :: String -> Int
count word = length $ filter isDigit n

然后你想确定一个单词是否有多个数字,这意味着它应该返回Bool

hasManyDigits :: String -> Bool
hasManyDigits word = count word > 1

然后你想找到一个多位数的句子中的单词数:

wordsWithManyDigits :: String -> [String]
wordsWithManyDigits sentence = filter hasManyDigits $ words sentence

然后你要数数呢

countWordsWithManyDigits :: String -> Int
countWordsWithManyDigits sentence = length $ wordsWithManyDigits sentence

words函数在空格上拆分字符串,我认为Data.Char.isDigit函数非常明显。


您可以将这些组合成一个单独的功能

count :: String -> Int
count = length . filter ((> 1) . length . filter isDigit) . words

但我认为这会让它失去可读性,即使它显示了Haskell能够很好地编写函数的能力。