2015-07-27 18 views
39

Ben yeni monad tanımlamaya çalışıyorum ve garip bir hatayıUygulamalı

newmonad.hs

 
newtype Wrapped a = Wrap {unwrap :: a} 
instance Monad Wrapped where 
    (>>=) (Wrap x) f = f x 
    return x = Wrap x 

main = do 
    putStrLn "yay" 
 
$ ghc --version 
The Glorious Glasgow Haskell Compilation System, version 7.10.1 

$ ghc newmonad.hs 
[1 of 1] Compiling Main    (newmonad.hs, newmonad.o) 

newmonad.hs:2:10: 
    No instance for (Applicative Wrapped) 
     arising from the superclasses of an instance declaration 
    In the instance declaration for ‘Monad Wrapped’ 

Neden alıyorum hiçbir örneği yükseltir Applicative'un bir örneğini tanımlamam gerekiyor mu?

+3

Bu arada, Haskell kaynak dosya adınızdaki ilk harf için büyük harf kullanmaya alışmak isteyebilirsiniz. Bunun nedeni, dosya adlarının büyük harfle başlayan modül adlarıyla eşleşmesidir. Sizin durumunuzda olduğu gibi, betik için çok önemli değil. İyi şanslar! – MasterMastic

cevap

63

Bu, Uygulamalı Monad Önerisi (AMP) 'dir. Şimdi, Monad olarak bir şey bildirdiğinizde, Applicative (ve dolayısıyla Functor) olarak da bildirmeniz gerekir. Matematiksel olarak, her monad , bir uygulama functor olan, bu yüzden mantıklı.

Sen hatayı kaldırmak için aşağıdakileri yapabilirsiniz:

instance Functor Wrap where 
    fmap f (Wrap x) = Wrap (f x) 

instance Applicative Wrap where 
    pure = Wrap 
    Wrap f <*> Wrap x = Wrap (f x) 

https://wiki.haskell.org/Functor-Applicative-Monad_Proposal

Düzenleme: Belki bu bir son şey olduğunu daha net işaret olmalıdır? Yayınladığınız kod, daha önce çalışmak için kullanıldı, ancak GHC'nin numaralı sürümlerinde bir hatayla karşılaşırsınız. Bu bir kırılma değişimi.

Düzenleme: aşağıdaki beyanları için herhangi monad çalışması gerekir:

import Control.Applicative -- Otherwise you can't do the Applicative instance. 
import Control.Monad (liftM, ap) 

instance Functor ??? where 
    fmap = liftM 

instance Applicative ??? where 
    pure = return 
    (<*>) = ap 

söz konusu monad bağlı olarak, orada daha verimli uygulamalar da mümkündür, ancak bu basit bir başlangıç ​​noktasıdır olabilir.

+0

Hastanın yeni olması, Başvuruların genellikle işleri yapmak için en genel yol olduğu ve Monad'ların biraz fazla olduğu anlaşılıyor. – fakedrake

+5

Monad'lar, sadece düz Uygulayıcı ile imkansız olan şeyleri yapmanıza izin verir. Özellikle, bir önceki eylemin sonucuna göre sonraki eylemin ne zaman yürütüleceğini seçme. – MathematicalOrchid

+7

Özellikle, GHC'nin bu hataya dönüştüğü son sürümü 7.10 sürümüdür. –