2016-02-16 14 views
5
{-# 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

+0

'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

cevap

5

Bazı özyinelemeli desenler sorunlu buna desugar ne gerekiyordu?

Desenler, birinci sınıf değerler değildir. Onlar sadece göründükleri tanımlarıyla değiştirilir. Böyle bir dil için, özyinel tanımlamalar genellikle mantıklı değildir.

+2

Eh, düz çift yönlü desen eşanlamlılarının özyinelemesine izin verilmesini önermedim. Sadece görüş kalıpları ile bu mantıklı olabilir; ama sonra bazı güzel uygulamalara izin verebilirdi. – leftaroundabout

+2

Eh 'L', özyinelemeli bir eşanlamlı ve reddedilmesi gerekiyor, bu yüzden sorunuzun başlığıyla eşleşiyor. Özyinelemenin bir işlevden geçtiğinde, tamam olabilir. –