从数字列表中提取数字作为字符串

时间:2018-03-21 04:47:29

标签: regex haskell

我真的不是一个有正则表达式的明星,特别是对于Haskell,甚至在阅读了一些tutos之后。

我有一个这样的数字列表:

let x = [1, 2, 3.5]

我的目标是从此输入中获取字符串"1.0 2.0 3.5"

我的想法是使用正则表达式。但我使用的方式很乏味。首先,我做

let xstr = show x

然后我删除第一个括号:

import           Text.Regex
let regex1 = mkRegex "\\["
let sub1 = subRegex regex1 xstr ""
-- this gives "1.0,2.0,3.5]"

然后我同样删除第二个括号:

  let regex2 = mkRegex "\\]"
  let sub2 = subRegex regex2 sub1 ""

最后我删除逗号并用空格替换它们:

  let regex3 = mkRegex ","
  let sub3 = subRegex regex3 sub2 " "

这会根据需要提供"1.0 2.0 3.5"

请你有更好的方法吗?

我总是有3个元素的列表,所以这种方法不是不现实的,但它既乏味又不优雅。我甚至不知道如何一次删除两个括号。

2 个答案:

答案 0 :(得分:2)

map将获取一个函数并将其应用于列表的每个元素,intercalate将在列表的每个元素之间定位。

import Data.List

stringify :: Show a => [a] -> String
stringify = intercalate " " . map show

样品使用:

> stringify [1, 2, 3.5]
"1.0 2.0 3.5"

我们的想法是尽可能长时间地将数据保存在计算机友好的形式中。你的方法会立即对整个事物进行字符串化,然后尝试操作一些应该被视为字符串整数列表的东西,这会导致一些混乱的变通方法,正如您已经看到的那样。

手工完成这项工作也是一项很好的练习。 mapintercalate都很容易实现,只需在Haskell中进行递归,这样做可能很有用。

答案 1 :(得分:0)

这看起来似乎并不太明显,但是,善良,我终于想到尝试'显示'浮点数很容易产生。事实上,Haskell将表面上混合类型列表的所有数字转换为最高常见类型。在让[1,2,3,4.5]单独产生[1.0,2.0,3.0,4.5]的情况下。我应该猜到了。 我发现了两种快速生成浮点字符串的方法。

concat [show fl ++ " "| fl <- [1,2,3,4.5]]

concat $ map (\st -> show st + " ") [1,2,3,4.5]

当然,这些可以很容易地参数化。我喜欢concat。它非常多才多艺。 有一个尾随空格,可以在concat之前使用“init $”轻松删除。

然后,当然,在发布此内容几分钟后,我尝试了

tail . init $ show [1,2,3,4.5]

它有效。哈斯克尔太酷了。但是,当然,我也不好。 最后一位产生一个字符串,但数字之间没有空格。他们之间有逗号:(