2013-03-23 9 views
10

Desen eşleştirmem gereken iki argümanı olan bir işleve sahibim. İlk desen üzerinde Currying kullanırsanız o derlenmeyecektir:Neden desen eşlemede diğerlerinden değil, desenlerden birini körleyebilirim?

drop' :: Int -> [a] -> [a] 
    drop' 0 = id -- ghci: "Equations for drop' have different numbers of arguments" 
    drop' n (x:xs) = drop' (n-1) xs 

derleyici bu çıktıyı verir: Ben sadece curried desen verirsen

99.hs:106:3: 
Equations for drop' have different numbers of arguments 
    99.hs:106:3-15 
    99.hs:107:3-33 
In an equation for `split': 
    split xs n 
     = (take' n xs, drop' n xs) 
     where 
      take' 0 _ = [] 
      take' n (x : xs) = x : take (n - 1) xs 
      drop' 0 = id 
      drop' n (x : xs) = drop' (n - 1) xs 
Failed, modules loaded: none. 

Ancak o zaman derler:

drop' :: Int -> [a] -> [a] 
    drop' 0 = id -- compiles 

Ne verir?

+1

Bildiğini varsayarak kolayca yazabilirsin 'drop' 0 x = x'? – Koterpillar

+3

Bir işlevi tanımlayan tüm denklemlerin aynı sayıda argümana sahip olması gerekir. Yani bırak 0 = id; bırakın n = \ (_: xs) -> bırak (n-1) xs' derlerdi. –

+4

[Bir işlevi tanımlayan tüm koşulların bitişik olması gerektiğini unutmayın, ** ve her bir maddede kalıpların sayısı aynı olmalıdır. **] (http://www.haskell.org/onlinereport/haskell2010/haskellch4.html# x10-830004.4.3) –

cevap

10

sadece açıklama (http://www.haskell.org/pipermail/haskell-cafe/2009-March/058456.html):

sorun argümanlar farklı sayıda tanımları en oluşumları düz yazım hatalarını olduğu anlamda, çok sözdizimsel bir. diğer uygulama sorunları olabilir: desen eşleşme kuralları daha karmaşık hale getirir.

+0

Bana öyle geliyor ki, birçok Haskell Raporunda, programcı hatasını nasıl koruyabileceğinizi, dilde neler ifade edebileceğinizden ödün vermeden geçtiniz. Ayrıca Daniel Fischer'ın yorumuna bakın ve korkulan monomorfizm kısıtlaması bile bu kategoriye girer. Şimdi hafif bir güçlük var ama daha sonra bunun için şükran duyacaksın. – yatima2975

+0

@ yatima2975 Tomurcuklardaki genel programcı hatalarını silmek istediğini anlayabiliyorum. Ama sadece bir derleyici uyarısı olamaz mıydı? Bir sürü derleyici uyarısının da rahatsız edici olabileceğini tahmin etsem de, (onları bastırmak için potansiyel ek açıklamalardan bahsetmeyeceğim), bu yüzden kodun belirgin bir şekilde daha az etkileyici olduğu bir durumu hayal edemediğimden eminim ki bu iyi bir uzlaşmadır. Bu hafif kısıtlama. – Guildenstern

1

Neden neden emin değilim, ancak bu bilinen bir sınırlamadır. Aynı işlevdeki tüm durumlar aynı sayıda argümana sahip olmalıdır. Bulabildiğim

1

Bu ghc sinir bozucu bir "özelliği", kesinlikle, fakat olmaktır düzeltmeye, bunu yapabilirsiniz: Sen ne hem köri veya zorunda ve

drop' n = \(x:xs) -> drop' (n-1) xs 

aynı hem argüman sayısı. Bu bir tiftik kontrolü ise, bu harika: ama keşke onu açmak/kapatmak için bir derleyici seçeneği olsaydı.

+2

Bu, diğer tanımla (ve aslında daha ayrıntılı) aynı olduğu için, noktayı biraz IMHO'ya yener. – jozefg

+0

@jozefg Bunu yayınladım çünkü daha fazla araştırma yapmadan diğer cevapları anlayamadım: alternatif bir bakış açısı genellikle yararlıdır. – jpaugh