在模式同义词代码中分解出常见常量?

问题描述 投票:0回答:1

我有一些这样的代码:

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 文档上看到:

字符串文字的行为非常类似于整数文字,即它们可以在表达式和模式中使用。如果在模式中使用,文字将被相等测试替换,就像整数文字一样。

所以这提出了几个问题:

  1. 我什至可以在不启用重载字符串扩展的情况下编写模式
    Alice
    吗?
  2. 我可以在 RHS 需要一些计算的情况下创建模式同义词,并让 GHC 使用
    Eq
    来匹配,就像它对数字和字符串文字所做的那样?或者数字和字符串文字是一种特殊情况,而 GHC 不允许泛化该功能?
haskell pattern-synonyms overloaded-strings
1个回答
1
投票

您可以使用视图模式来执行模式中的任何计算,然后使用结果来匹配其他任何内容。

ghci> :set -XPatternSynonyms
ghci> :set -XViewPatterns
alice = "Alice"
ghci> pattern Alice <- ((==alice) -> True)

在这里,您将

(==alice)
应用于参数并将结果与
True
进行匹配。

© www.soinside.com 2019 - 2024. All rights reserved.