Haskell 数据的区分大小写/不区分大小写比较。文本?

Haskell 数据的区分大小写/不区分大小写比较。文本?,haskell,text,comparison,Haskell,Text,Comparison,我经常需要对数据进行比较。文本值具有不同的区分大小写要求-这在我用于NLP任务时经常出现 例如,在为信息提取任务搜索标记时,我经常需要基于相等关系进行搜索,这种相等关系的限制性比标准字符串相等少。区分大小写是这些更改中最常见的,但它通常是特定标记的函数。像“activate”这样的词通常可能是小写的,但如果它是句子中的第一个词,它将以前导大写字母开头,或者如果在标题文本中使用,它可能会出现在所有大写字母或大写的中间句子中,因此忽略大小写的比较是有意义的。相反,首字母缩略词(如“US”)根据大小写

我经常需要对数据进行比较。文本值具有不同的区分大小写要求-这在我用于NLP任务时经常出现

例如,在为信息提取任务搜索标记时,我经常需要基于相等关系进行搜索,这种相等关系的限制性比标准字符串相等少。区分大小写是这些更改中最常见的,但它通常是特定标记的函数。像“activate”这样的词通常可能是小写的,但如果它是句子中的第一个词,它将以前导大写字母开头,或者如果在标题文本中使用,它可能会出现在所有大写字母或大写的中间句子中,因此忽略大小写的比较是有意义的。相反,首字母缩略词(如“US”)根据大小写具有不同的语义

这就是我不能为每个equality类轻松创建typeclass包装器的原因,因为它是一个值驱动的方面。(因此,该软件包看起来不起作用)

到目前为止,我正在使用
toLower
制作一个规范表示,并比较这些表示,以便创建带有敏感标志的文本比较函数的自定义版本,例如:

matches :: CaseSensitive -> Text -> Text -> Bool
matches Sensitive   x y = x == y
matches Insensitive x y = (T.toLower x) == (T.toLower y)
然而,我担心这需要对输入文本进行额外的传递。我可以想象它在某些情况下融合,但可能不是全部(例如:T.isSuffixOf,T.isInfixOf)


有更好的方法吗?

如果比较的样式是由被比较对象的语义驱动的,那么将这些语义与实际文本一起传递是否有意义?然后,您还可以在适当的情况下正常化,以避免以后重复通过:

data Token = Token CaseSensitive Text -- Text is all lower-case if Insensitive
    deriving Eq
也许可以定义一个智能构造函数:

token Sensitive t = Token Sensitive t
token Insensitive t = Token Insensitive (T.toLower t)
这意味着首字母缩略词“US”永远无法与“US”一词相比较,但这似乎是合乎逻辑的


您还可以使用更详细的标记值,如首字母缩略词/word/。。。不应仅使用
敏感
/
不敏感

进行不区分大小写的比较,而应使用
toCaseFold
而不是
toLower
。当你确定所有的文本都是英语时,这也许没什么大不了的,但使用更通用的方法仍然是一个好习惯。你可以使用顶级函数
isCaseSensitive
,也许可以使用
数据。设置区分大小写的单词(包括“US”,但不包括“US”或“US”),然后写一个等式检查,表示
匹配xy | isCaseSensitive x | | isCaseSensitive y=x==y
|否则=toCaseFold x==toCaseFold y