今天我遇到了一个奇怪的问题。在where子句下定义的函数没有被模式匹配看到。
foo (bar -> 1) = 2
where
bar _ = 1
此代码拒绝编译声明变量条不存在。
当然,这是一个简单的解决方案,但我对这种范围规则背后的推理感兴趣。
答案 0 :(得分:11)
我不是视图模式方面的专家,也不参与创建视图模式,所以我不能告诉你“他们为什么这么做”,但我确实知道为什么他们这样做更好
where
子句引入的绑定限定在单个模式中,而不是作为整体的函数,并且where
子句中的绑定可以访问由封闭引入的绑定图案。
对于普通模式,这很有效,因为您可以通过查看其构造函数来判断模式是否匹配,如果是,您可以将模式的where
子句置于范围内,如果需要还可以检查模式警卫等等。
但对于视图模式,这有点怪异:where
子句中引入的函数可能依赖于模式的绑定,但为了均匀匹配视图模式,您必须具有{{{{1}的绑定。 1}}条款也适用。
也许有办法解决这个循环依赖(我不知道),但它肯定会让我感到困惑。