【问题标题】:Extract numbers as strings from list of numbers从数字列表中提取数字作为字符串
【发布时间】:2018-03-21 04:47:28
【问题描述】:

我真的不是正则表达式的明星,尤其是 Haskell,甚至在阅读了一些教程之后。

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

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 个元素的列表,所以这种方法并非不切实际,但它既乏味又不优雅。我什至不知道如何一次删除两个括号。

【问题讨论】:

    标签: regex haskell


    【解决方案1】:

    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 中通过递归实现,这样做是有用的做法。

    【讨论】:

    • 谢谢。非常清楚。可以将intercalate " " 替换为unwords(根据Hlint)。
    【解决方案2】:

    这似乎不太明显,但是,天哪,我终于想到尝试“显示”非常容易生成的浮点数。事实上,Haskell 将表面上混合类型列表的所有数字转换为最常见的类型。在 let [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 之前使用 "init $ ' 轻松删除。

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

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

    它奏效了。 haskell 太酷了。但是,当然,我的错。 最后一位产生一个字符串,但数字之间没有空格。它们之间有逗号:(

    【讨论】:

      猜你喜欢
      • 2017-03-11
      • 2014-07-12
      • 2017-05-22
      • 2020-09-28
      • 1970-01-01
      • 2021-11-27
      相关资源
      最近更新 更多