Haskell 为什么所有递归模式同义词都被拒绝?
当然,对于简单的直接自指模式来说,这是有意义的。但是,是否有一些根本的原因导致即使是上面提到的视图模式中介的布局也不可能呢?我觉得这不能令人信服;毕竟,可以内联视图模式并获得完全无害的(嗯……至少是允许的)定义:Haskell 为什么所有递归模式同义词都被拒绝?,haskell,recursion,pattern-matching,pattern-synonyms,Haskell,Recursion,Pattern Matching,Pattern Synonyms,当然,对于简单的直接自指模式来说,这是有意义的。但是,是否有一些根本的原因导致即使是上面提到的视图模式中介的布局也不可能呢?我觉得这不能令人信服;毕竟,可以内联视图模式并获得完全无害的(嗯……至少是允许的)定义: /tmp/wtmpf-file10227.hs:1:1: Recursive pattern synonym definition with following bindings: foo (defined at /tmp/wtmpf-file10227.hs:(6
/tmp/wtmpf-file10227.hs:1:1:
Recursive pattern synonym definition with following bindings:
foo (defined at /tmp/wtmpf-file10227.hs:(6,1)-(8,13))
Yum (defined at /tmp/wtmpf-file10227.hs:10:1-28)
fooey::quon->Bool
foeyfoo=True
foey(Oink(foey->True))=True
fooey=假
模式(真)
那么,这些同义词是否由于技术原因还不可用,我们将来会得到它们呢?一些递归模式是有问题的,比如
fooey :: Quun -> Bool
fooey Foo = True
fooey (Oink (fooey -> True)) = True
fooey _ = False
pattern Yum <- (fooey -> True)
f::[()]->Bool
f L=真
f uz=False
模式L好吧,我不建议简单的双向模式同义词应该被允许是递归的。只有使用视图模式,这才有意义;但是它确实允许一些很好的应用。嗯,L
是一个递归模式同义词,需要被拒绝,因此它与您问题的标题匹配。我同意当递归通过一个函数时,它可能没问题。patternsynoms
的作者:这是一个很好的观点,值得为它开一张罚单。不过,这可能不容易实现,因为如果我没记错的话,GHC不会公开太多关于“为什么”某些东西最终会出现在自由变量集中的信息。
fooey :: Quun -> Bool
fooey Foo = True
fooey (Oink (fooey -> True)) = True
fooey _ = False
pattern Yum <- (fooey -> True)
f :: [()] -> Bool
f L = True
f _ = False
pattern L <- () : L