我真的不是一个有正则表达式的明星,特别是对于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个元素的列表,所以这种方法不是不现实的,但它既乏味又不优雅。我甚至不知道如何一次删除两个括号。
答案 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"
我们的想法是尽可能长时间地将数据保存在计算机友好的形式中。你的方法会立即对整个事物进行字符串化,然后尝试操作一些应该被视为字符串整数列表的东西,这会导致一些混乱的变通方法,正如您已经看到的那样。
手工完成这项工作也是一项很好的练习。 map
和intercalate
都很容易实现,只需在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]
它有效。哈斯克尔太酷了。但是,当然,我也不好。 最后一位产生一个字符串,但数字之间没有空格。他们之间有逗号:(