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
子句也已到位。
也许有办法解决这种循环依赖(我不知道),但它肯定会让我感到困惑。
今天遇到一个奇怪的问题。模式匹配未发现在 where 子句下定义的函数。
foo (bar -> 1) = 2
where
bar _ = 1
此代码拒绝编译,指出变量 bar 不存在。
当然,这很容易解决,但我对此类范围规则背后的推理很感兴趣。
我不是视图模式方面的专家,也没有参与创建它们,所以我不能告诉你 "why they were made this way",但我确实知道为什么它们以这种方式工作得更好。
where
子句引入的绑定仅限于单个模式,而不是整个函数,并且 where
子句中的绑定可以访问由封闭模式。
对于普通的模式,这很有效,因为你可以通过查看它的构造函数来判断模式是否匹配,如果匹配,你可以将模式的 where
子句引入范围,如果需要,还可以检查图案守卫等
但是对于视图模式,这有点奇怪:where
子句中引入的函数可能依赖于模式的绑定,但为了匹配视图模式,您必须具有来自where
子句也已到位。
也许有办法解决这种循环依赖(我不知道),但它肯定会让我感到困惑。