2016-03-02 22 views
9

GHC 7.10.x Migration hakkında bir makale okuyordum. Hataları düzeltmek için bazı öneriler var. GHC şikâyet ederseGHC 7.10.x migrasyonu: Neden bir başvuruda "pure = return" yazmıyor?

GHC No instance for (Applicative ...)

diyor

Foo.hs: 7: 10: örneği bildirisinde bir örnek beyanı ait süper sınıf kaynaklanan (Uygulamalı Foo) için örnek 'Monad Foo' için bu hatayı düzeltmenin kolay bir yolu, bir Uygulayıcı (ve muhtemelen bir Functor) örneğini tanımlamaktır: Örnek Functor Foo burada fmap = liftM - veya alternatif olarak: - f harita = m >> = saf. DO NOT USE `pure = return` ve DO NOT USE `(*>) = (>>): f

instance Applicative Foo where 
    -- NB: DO NOT USE `pure = return` 
    pure = {- move the definition of `return` from the `Monad` instance here -} 

    (<*>) = ap {- defined in Control.Monad -} 
    -- or alternatively: 
    -- f1 <*> f2 = f1 >>= \v1 -> f2 >>= (pure . v1) 

    -- NB: DO NOT USE `(*>) = (>>)` 
    (*>) = {- move the definition of `>>` from the `Monad` instance here -} 

instance Monad Foo where 
    return = pure {- definition moved to `Applicative(pure)` -} 

    (>>) = (*>) {- definition moved to `Applicative((*>))` -} 

    {- ...retain other previous definitions... -} 

Onaylanmış vardır. Neden kimse kullanamaz?

P.S. Kullanmaya çalıştım ve derlendi. @WillSewell olarak

+4

Bu, özyinelemeli tanımlara yol açacaktır: “Monad” işlevi, “Uygulamanın” örnek işlevleri açısından tanımlanmıştır, bu nedenle başka şekilde de gidemezsiniz. –

cevap

7

tipi sınıfında Monad şimdi returnbase-4.8.0.0 itibaren açıklamada ima bir varsayılan uygulaması vardır: pure = return tanımlanması ve uygulanması için unutmak By

class Applicative m => Monad m where 
    return  :: a -> m a 
    return  = pure 

return elle tek tanımının sonsuz döngü yaratabilir ki derleme geçecek ve sadece çalışma zamanında tespit edilebilir.

>> şimdilik farklı bir hikaye. Bu >>= yalnızca varsayılan bir uygulama rölesi vardır:

(>>) :: forall a b. m a -> m b -> m b 
m >> k = m >>= \_ -> k 

ve >>= tanımında *> kullanmadıkça *> = >> tarafından, sonsuz döngüye oluşturmaz, ancak base olası bir sonraki büyük değişiklik hakkında some concern vardır (>>'un >> = *> numaralı telefonunun varsayılan uygulamasını değiştirebilir), ileri düzey uyumluluk açısından *> = >> önerilmemektedir.