2014-07-15 7 views
6

Operatörlerde şablon eşlemesini yapmak istediğim bir durumla karşılaştım. Ancak, bu GHC ile Pattern match(es) are overlapped hatasını atar. Nedenini anlayamıyorum. Operatörlerde şablon eşleşmesine izin verilmiyor mu? Bir operatör sembolünü converts it into an identifier parantez içine aldığından bu işe yaramış olmalıyım.Model Eşleşmeleri örtüşüyor - Operatörlerdeki şablon eşleşmesi

test :: (Integer -> Integer -> Integer) -> String 
test (+) = "plus" 
test (-) = "minus" 
test _ = "other" 

Yapmak istediklerimi gerçekleştirmenin başka yolları da var. Bunun neden işe yaramadığını merak ediyorum.

+9

İlk hattınız herhangi bir işlevle eşleşir ve yerel olarak infix operatörüne + bağlar. Sonraki satırlar bu nedenle gereksinimlere ve dolayısıyla uyarıya ihtiyaç duyarlar. Fonksiyon simgelerinin, infix veya notlarının, bu şekilde desen eşleştirmesiyle yerel olarak geri alabileceğini unutmayın. Yalnızca büyük harfle yazılan kurucular (veya: - düzeltilmiş infix kurucuları) ve değişmezler yalnızca kendileriyle eşleşir ve daha sonra yalnızca birinci dereceden türler ile eşleşir. Haskell (hemen hemen) fonksiyonların yönelimli özelliklerini incelemek için hiçbir şekilde (neredeyse) hiçbir şekilde vermez: (sırayla) sadece onların genişleme özelliklerini kullanarak uygulayabilirsiniz. "Bu + işlevi mi?" izin verilmiyor. – pigworker

+0

@pigworker, bu, 'bu bağlama neden mevcut başlangıç ​​tanımı' mesajını aldığımı açıklıyor. bilgi için teşekkürler. –

cevap

12

(+) ve (-) tip Integer -> Integer -> Integer ait kurucu değil:

  • Onlar yapıcı isimleri
  • Integer -> Integer -> Integer bir cebirsel veri türü değildir değildir

Ve böylece kod herhangi birini kullanarak eşdeğerdir ilk argümanı bağlamak için diğer değişken isimleri Bu üç paternin aslında bir şeyle eşleştiğini (ve ilk ikisinin bazı isimleri bağladığını) açıkça umuyoruz. Diğer bir deyişle, ilk kalıbın (örneğinizde foo veya (+)) düşmesi mümkün değildir, bu yüzden kalan iki ile çakışır.

+0

anlaşıldı. Teşekkürler! –