ViewPatterns 作用域背后的推理

Reasoning behind scoping of ViewPatterns

今天遇到一个奇怪的问题。模式匹配未发现在 where 子句下定义的函数。

foo (bar -> 1) = 2
  where
    bar _ = 1

此代码拒绝编译,指出变量 bar 不存在。

当然,这很容易解决,但我对此类范围规则背后的推理很感兴趣。

我不是视图模式方面的专家,也没有参与创建它们,所以我不能告诉你 "why they were made this way",但我确实知道为什么它们以这种方式工作得更好。

where 子句引入的绑定仅限于单个模式,而不是整个函数,并且 where 子句中的绑定可以访问由封闭模式。

对于普通的模式,这很有效,因为你可以通过查看它的构造函数来判断模式是否匹配,如果匹配,你可以将模式的 where 子句引入范围,如果需要,还可以检查图案守卫等

但是对于视图模式,这有点奇怪:where 子句中引入的函数可能依赖于模式的绑定,但为了匹配视图模式,您必须具有来自where 子句也已到位。

也许有办法解决这种循环依赖(我不知道),但它肯定会让我感到困惑。