我经常需要对具有不同的区分大小写要求的Data.Text值进行比较 - 当我使用chatter进行NLP任务时,这种情况经常出现。
例如,在搜索令牌以寻找信息提取任务时,我经常需要根据比标准字符串相等性更少限制的等式关系进行搜索。区分大小写是这些更改中最常见的,但它通常是特定令牌的功能。像"激活"这样的术语通常可能是小写,但如果它是一个句子中的第一个单词,它将以一个主要资本开头,或者如果在标题文本中使用可能是全部大写或大写中句,那么忽略案例的比较是有道理的。相反,首字母缩略词(例如," US")根据大小写具有不同的语义。
这就是说我不能轻易地为每个相等级创建一个类型类包装器,因为它是一个价值驱动的方面。 (因此case-insensitive包看起来不会起作用)。
到目前为止,我使用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)。
有更好的方法吗?
答案 0 :(得分:2)
如果比较的样式是由被比较的东西的语义驱动的,那么通过这些语义传递实际文本是否有意义?然后,您也可以在适当的时候进行标准化,以避免以后重复传递:
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”永远不会与“我们”这个词相提并论,但这似乎是合乎逻辑的。
您也可以使用更为详细的内容标记值,例如首字母缩略词/ word / ...而不仅仅是Sensitive
/ Insensitive
。