我在定义一个函数时遇到了一些困难,该函数解析了一堆字符串并过滤了表单的字符串:
v 3.0 2.0 3.7
其中v
是标识符。有一堆标识符(vt
,f
等),但我只对那些以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
函数没什么好处。
过滤仅以特定字词开头的行的最简单方法是什么?
答案 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"]