2010-11-18 12 views
5

LYAH okuyordum. Bu nedenNeden (->) Control.Monad.Instances tarafından varsayılan olarak uygulanmadı

((fmap (+5)) (+5)) 4 

geçerli: Ben açıkça şu sözdizimi işe almak için Control.Monad.Instances yüklenmesi gerektiğini söylüyor? Neden bu işlevsellik elde etmek için açıklayıcı ve birleştirici bir teknoloji olan Control.Monad.Instances'u açık bir şekilde yüklemeliyim. (->) olmadan nasıl uygulanır (veya sadece gizli ve sadece -> dışa aktarılır)? Neden varsayılan olarak uygulanmış fmap işlev türü işlevleri kullanılmıyor?

+0

Ayrıca bkz. Http://stackoverflow.com/questions/4204086/is-the-monad-w-instance-anywhere-standard –

cevap

10

Burada 3 farklı kavram var. İşlev tipi, Functor tipi sınıfı ve Functor "örneği". Fonksiyon tipi (->), dilin içine yerleştirilmiştir ve varlığı ve uygulaması Functor ve fmap ile tamamen ilgisizdir. Tip sınıfı, ilgili yöntemlerinin imzasının belirtimidir. "Örnek" bu imzanın bir uygulamasıdır.

Sorunuzu açıklığa kavuşturmak için, "Neden Prelüd'de sağlanan (->) için Functor örneğidir?" (Prelude, varsayılan olarak kapsamı olan modüldür). Şu anda ifade edildiği gibi, çok anlamlı değil.

Değiştirilen sorunun cevabı basit: Haskell Raporu (Prelude'un arabiriminin belirtildiği resmi dil belirtimi) içermez. Muhtemelen gerekir, ama Haskell dili ve kütüphaneleri o zamandan beri çok gelişmiştir ve Haskell standartları yavaşça değişme eğilimindedir. Her durumda, doğru ya da yanlış, bu yüzden.

2

Functor bir dil özelliği değil, yalnızca tanımlamak için rastgele bir modülün bulunduğu kullanışlı bir yazım. Bu modülün Functor tanımını kullanmak için onu yüklemeniz gerekir, hikayenin sonu.