【问题标题】:How to parse ints out of string in Haskell如何在 Haskell 中从字符串中解析整数
【发布时间】:2019-04-19 13:06:19
【问题描述】:

我正在尝试解析以下格式的字符串:

(x,y) (r,g,b)

我的文件在每一行都包含这种字符串。 我已经提取了线条,现在我想提取它的值,但我找不到令人满意的东西。 我想做类似的事情:

case str of
['(', x, ',', y, ')', ' ', '(', r, ',', g, ',', b, ')'] -> The rest

我知道它不起作用,我是 Haskell 的新手,所以我不断遇到我不理解的错误。 我怎样才能做到?

编辑: 我以前创建过这个,但是一旦创建了变量,我不知道如何真正使用它:

data Points = Point Coords Colors
data Colors = Color Float Float Float
data Coords = Coord Int Int

数字不限于一位,r、g、b 的范围是 0 到 255。

【问题讨论】:

  • 您可能想了解解析器,尤其是 parsec 库。

标签: string parsing haskell character point


【解决方案1】:

这个特定任务的简单技巧:

data Pix = Pix (Int,Int) (Int,Int,Int)
 deriving (Read, Show)

parsePix :: ReadS Pix
parsePix s = reads $ "Pix "++s
*Main&gt; parsePix "(1,2) (3,4,5)"<br>[(Pix (1,2) (3,4,5),"")]

一般来说,您应该查看适当的解析器组合库,我推荐megaparsec

【讨论】:

  • 谢谢。如何返回一个像素而不是打印它,以及如何在创建 Pix 后读回它的值?编辑:我实际上并没有真正理解它。这个函数会创建一个 Pix 吗?什么是 ReadS?
  • LMHTFY。基本上,ReadS 的结果是一个列表,其中要么包含一个有效的已解析元素,要么什么都不包含(如果解析器失败)。
  • 那么返回值的第一个元素是一个像素?
  • 是的。另一个只是字符串的剩余部分(如果有的话)。
  • 与任何其他列表一样:通过模式匹配,case ... of ((Pix pt color, _):_) -&gt; ...,或者您可以折叠它,或者在它上面使用mapM_,等等。等等。
猜你喜欢
  • 1970-01-01
  • 2012-06-29
  • 1970-01-01
  • 1970-01-01
  • 2012-04-13
  • 2013-05-16
  • 1970-01-01
  • 2011-04-03
  • 2010-09-21
相关资源
最近更新 更多