如何在Haskell中使用带有正则表达式的map

时间:2019-10-06 16:18:51

标签: haskell

当尝试将以下正则表达式应用于列表中的每个元素(测试)时,出现错误。这就是我要在ghci中做的事

import Text.Regex.TDFA
let test = ["<lobbying_firm>The CrisCom Company</lobbying_firm>","<registration_year>2013</registration_year>"]
let regExp = "\\>(.)*\\<"
let result = map (=~ regExp :: String) test

我该怎么做?有什么想法吗?

1 个答案:

答案 0 :(得分:2)

您非常亲密。唯一的问题是您的类型签名将在此处产生一些麻烦。您想要的(=~ rexExp)的类型可能是String -> String。实际上,映射函数的类型是一个以String作为参数,并在此处返回String的函数。不是String本身。

我们可以这样创建一个map

result = map ((=~ regExp) :: String -> String) test

这将产生:

Prelude Text.Regex.TDFA> map ((=~ regExp) :: String -> String) test
[">The CrisCom Company</",">2013</"]

话虽这么说,我强烈建议用正则表达式解析HTML,XML,JSON等。实际上,regexes can not parse HTML和其他递归语言。这是Pumping lemma for regular languages [wiki]的结果。您永远无法完全解析HTML。您可能确实解析了一些子语言,等等。但是即使这样,正则表达式也很容易变得(非常)复杂。因此,最好使用tagsoup [hackage]之类的库,或scalpel [hackage]之类的刮板库。