ViewPatterns范围界定背后的推理

Wel*_*oni 2 haskell scoping

今天我遇到了一个奇怪的问题.模式匹配没有看到在where子句下定义的函数.

foo (bar -> 1) = 2
  where
    bar _ = 1
Run Code Online (Sandbox Code Playgroud)

此代码拒绝编译声明变量bar不存在.

当然,这是一个简单的解决方案,但我对这种范围规则背后的推理感兴趣.

ama*_*loy 11

我不是视图模式的专家,我也不参与创建它们,所以我不能告诉你"为什么它们是这样做的",但我确实知道为什么它们以这种方式更好地工作.

where子句引入的绑定在单个模式中范围内,而不是作为整体的函数,并且where子句中的绑定可以访问由封闭模式引入的绑定.

对于普通模式,这很有效,因为您可以通过查看其构造函数来判断模式是否匹配,如果是这样,您可以将模式的where子句放入范围,如果需要还可以检查模式保护等.

但对于视图模式,这有点怪异:where子句中引入的函数可能依赖于模式的绑定,但为了甚至匹配视图模式,您还必须具有该where子句的绑定.

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