2012-09-13 22 views
9

Desenler:Aritmetik desen yasal mı Haskell? Böyle

front :: [a] -> a 
front (x:_) = x 
front _ = error "Empty list" 

Haskell yaygın görünmektedir, ama Haskell öğrenmeye başladığımda belirgin aşağıdaki öğrenme hatırlıyorum:

dec :: (Integral a) => a -> a 
dec (x+1) = x 
dec _ = error "Bottom" 

Ancak ghc kod parçası reddetmek görünüyor belirterek:

Parse error in pattern: x + 1

hugs ürünü sadece güzel olarak kabul ediyor. Yani, bu geçerli Haskell olsun ya da değil ve bu derleyiciler neden farklı davranıyorlar.

+0

Hayır, geçerli değil. –

+0

@ ДМИТРИЙМАЛИКОВ: Peki, neden sarılmayı kabul ediyor? – bitmask

+2

@bitmask 2006'dan bu yana sarılmalar yayınlanmadığından ve “NPlusKPatterns” Haskell2010 standardında kaldırıldı. –

cevap

16

n+k kalıbı olarak bilinen budur. Genel olarak disliked idi ve Haskell2010 spesifikasyonundan çıkarıldı ve GHC, varsayılan olarak en son özelliklerle güncellenmemiş Hug'lerin aksine bunu etkinleştirir. Etkin -XNPlusKPatterns bayrağı ile GHCI ile derlenmelidir. Daha fazla ayrıntı için bkz. this.

9

Haskell 98'de bu yasal bir durumdur, ancak bu, haskell 2010'da yasaklanmıştır ve GHC'nin son sürümleri budur. Öte yandan Hugs yıllardır güncellenir ve örneğin n+1 için hangi maç numaraları var olabileceği ancak bu n+1 uyabilecek hiçbir n olmadığından sevmiyordu olan Haskell 98

n + k desenler uygulayan değildi.

kayan nokta sayıları düşünün: n+1 uyan bir sayı söz konusudur (4294967296 :: Float 4294967295 n + 1, fakat bu sayı, bir Float içine monte edilemez - round (4294967296 :: Float) ve round (4294967295 :: Float), hem 4294967296 verim karşılaştırın) .

Ayrıca, + (haskell, operatör aşırı yüklenmesini destekliyor) rebounduna sahip olabilirsiniz, bu nedenle desen eşleşmesi ne anlama gelir? Bu belirsizlikleri önlemek için, n + k desenlerine izin verilmedi. Eğer zaten n + k deseni kullanmak istiyorsanız

, kaynak dosyalarının üstünde bir dil pragma kullanabilirsiniz:

{-# LANGUAGE NPlusKPatterns #-} 

PS: Ben tüm this email thread başladı inanıyoruz.