为什么拒绝所有递归模式同义词?

时间:2016-02-16 17:52:07

标签: haskell recursion pattern-matching pattern-synonyms

{-# LANGUAGE PatternSynonyms, ViewPatterns #-}

data Quun = Foo | Bar | Oink Quun

fooey :: Quun -> Bool
fooey Foo = True
fooey (Oink Yum) = True
fooey _ = False

pattern Yum <- (fooey -> True)

这不编译(至少在GHC-7.10.2中)

/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 :: Quun -> Bool
fooey Foo = True
fooey (Oink (fooey -> True)) = True
fooey _ = False

pattern Yum <- (fooey -> True)

那么,这些同义词是否因技术原因尚不可用,我们将来会得到它们吗?

1 个答案:

答案 0 :(得分:5)

某些递归模式存在问题,例如

f :: [()] -> Bool
f L = True
f _ = False

pattern L <- () : L

这应该是什么药物?

模式不是一流的价值观。它们只是在它们出现的定义中被替换。对于这种语言,递归定义通常不合理。