作者:wy | 来源:互联网 | 2022-12-17 12:06
今天我遇到了一个奇怪的问题.模式匹配没有看到在where子句下定义的函数.
foo (bar -> 1) = 2
where
bar _ = 1
此代码拒绝编译声明变量bar不存在.
当然,这是一个简单的解决方案,但我对这种范围规则背后的推理感兴趣.
1> amalloy..:
我不是视图模式的专家,我也不参与创建它们,所以我不能告诉你"为什么它们是这样做的",但我确实知道为什么它们以这种方式更好地工作.
where
子句引入的绑定在单个模式中范围内,而不是作为整体的函数,并且where
子句中的绑定可以访问由封闭模式引入的绑定.
对于普通模式,这很有效,因为您可以通过查看其构造函数来判断模式是否匹配,如果是这样,您可以将模式的where
子句放入范围,如果需要还可以检查模式保护等.
但对于视图模式,这有点怪异:where
子句中引入的函数可能依赖于模式的绑定,但为了甚至匹配视图模式,您还必须具有该where
子句的绑定.
也许有办法解决这个循环依赖(我不知道),但它肯定会让我感到困惑.