如何根据Haskell中的第一个单词过滤行?

时间:2013-11-23 04:21:57

标签: haskell

我在定义一个函数时遇到了一些困难,该函数解析了一堆字符串并过滤了表单的字符串:

v 3.0 2.0 3.7

其中v是标识符。有一堆标识符(vtf等),但我只对那些以v开头的标识符感兴趣。

函数标题如下所示:

readOBJVerts :: [String] -> [Point]

到目前为止我有这个:

readOBJVerts lines = [(x,y,z) | line <- lines,
                      let x = read (coords !! 1) :: GLDouble
                          y = read (coords !! 2) :: GLDouble
                          z = read (coords !! 3) :: GLDouble
                          coords = splitOn " " line

但是,我收到以下错误:

Main.hs: Prelude.read: no parse
Main.hs: interrupted

我相信这是因为我的功能目前不仅仅过滤v行。所以它试图解析像:

这样的行
f 1/2 2/1 3/4

read函数没什么好处。

过滤仅以特定字词开头的行的最简单方法是什么?

1 个答案:

答案 0 :(得分:3)

在haskell理解中,您可以向其添加布尔表达式,以便与表达式不匹配的任何值都不包含在最终结果中。例如[x | x <- [1..10], even x ]返回[2,4,5,6,10]。这样可以对您的功能进行简单调整,使其按您的需要运行:

readOBJVerts lines = [(x,y,z) | line <- lines,
                      let x = read (coords !! 1) :: GLDouble
                          y = read (coords !! 2) :: GLDouble
                          z = read (coords !! 3) :: GLDouble
                          coords = splitOn " " line,
                      (coords !! 0) == "v"]