我有一些这样的代码:
newtype T = T Text
pattern Alice = T "Alice"
这很好,但我在其他地方使用了“Alice”。所以我决定像这样分解它:
alice :: Text
alice = "Alice"
pattern Alice = T alice
但是当我在警告的情况下构建这个时,我收到了有关未使用变量的警告。
然后我意识到:
pattern Alice = T alice
实际上匹配所有内容,而不是仅仅
T "Alice"
看起来很奇怪,甚至允许
T "Alice"
,因为 "Alice"
是 Text
,是计算出来的。
但是后来我在 Overloaded Strings 文档上看到:
字符串文字的行为非常类似于整数文字,即它们可以在表达式和模式中使用。如果在模式中使用,文字将被相等测试替换,就像整数文字一样。
所以这提出了几个问题:
Alice
吗?Eq
来匹配,就像它对数字和字符串文字所做的那样?或者数字和字符串文字是一种特殊情况,而 GHC 不允许泛化该功能?您可以使用视图模式来执行模式中的任何计算,然后使用结果来匹配其他任何内容。
ghci> :set -XPatternSynonyms
ghci> :set -XViewPatterns
alice = "Alice"
ghci> pattern Alice <- ((==alice) -> True)
在这里,您将
(==alice)
应用于参数并将结果与 True
进行匹配。