{-# 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)
Bu, bu mantıklıdır basit doğrudan kendi kendine yönlendiren kalıpları için,Neden tüm özyinelemeli eş anlamlılar reddedildi?
/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)
Emin (en azından GHC-7.10.2 olarak) derleme değil. Ancak, yukarıdaki gibi bir görüntü deseni aracılı mizanpajının bile mümkün olmamasının bazı temel nedenleri var mıdır? Bu inandırıcıyı bulamıyorum; Sonuçta bu görünüm desen satır içi ve (iyi ... en azından izin) tamamen zararsız tanımını almak mümkündür:
fooey :: Quun -> Bool
fooey Foo = True
fooey (Oink (fooey -> True)) = True
fooey _ = False
pattern Yum <- (fooey -> True)
Yani, sadece mevcut değil böyle eş teknik nedenlerle henüz, ve irade Onları gelecekte mi alacağız?
f :: [()] -> Bool
f L = True
f _ = False
pattern L <-() : L
gibi
'PatternSynonyms''nin yazarı burada: Bu iyi bir nokta ve bir bilet açmaya değer. Bununla birlikte, bu doğru bir şekilde uygulanamaz, çünkü eğer doğru hatırlamıyorsam, GHC, “neden” in bir şey serbest değişkenler kümesinde bittiği hakkında çok fazla bilgi açığa çıkarmaz. – Cactus