ViewPatterns范围界定背后的推理

时间:2018-05-15 19:13:50

标签: haskell scoping

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

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

此代码拒绝编译声明变量条不存在。

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

1 个答案:

答案 0 :(得分:11)

我不是视图模式方面的专家,也不参与创建视图模式,所以我不能告诉你“他们为什么这么做”,但我确实知道为什么他们这样做更好

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

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

但对于视图模式,这有点怪异:where子句中引入的函数可能依赖于模式的绑定,但为了均匀匹配视图模式,您必须具有{{{{1}的绑定。 1}}条款也适用。

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