2015-10-04 10 views
7

私はmtlライブラリの精神でMaybeTを実装しようとしています。この非コンパイル溶液で:GHCはモナドトランスのFunctorインスタンスとApplicativeインスタンスを派生させることはできますか?

{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, UndecidableInstances #-} 

import Control.Monad 
import Control.Monad.Trans 
import Control.Monad.State 

newtype MaybeT m a = MaybeT { runMaybeT :: m (Maybe a) } 

instance (Monad m) => Monad (MaybeT m) where 
    x >>= f = MaybeT $ runMaybeT x >>= maybe (return Nothing) (runMaybeT . f) 
    return a = MaybeT $ return (Just a) 
    fail _ = MaybeT $ return Nothing 

instance MonadTrans MaybeT where 
    lift m = MaybeT (liftM Just m) 

instance (MonadIO m) => MonadIO (MaybeT m) where 
    liftIO m = lift (liftIO m) 

instance (MonadState s m) => MonadState s (MaybeT m) where 
    get = lift get 
    put = lift . put 

... 

私はエラーを取得する:

Could not deduce (Applicative (MaybeT m)) arising from the superclasses of an instance declaration from the context (Monad m)

私は次のように実装する場合、それはコンパイル:

instance (Monad m) => Applicative (MaybeT m) where 
    pure = return 
    (<*>) = ap 

instance (Monad m) => Functor (MaybeT m) where 
    fmap = liftM 

GHCは私のためにこれを行うことができますか?

+0

関連:http://stackoverflow.com/questions/18861231/why-is-there-no-xderiveapplicative-extension – dfeuer

答えて

5

いいえ、GHCは現在それを行うことはできません。おそらく将来的にはそうなるでしょう。

適用可能なインスタンスを追加する必要性は、GHC 7.10と「すべてのブリッジを作成する」提案で導入されたかなり新しいものです。これは、前のクラス階層のいくつかのいぼを修正しました。最後に、そのモナドが、ファンクタのサブクラスであるアプリケーションのサブクラスです。残念ながら、これは下位互換性を損なうため、アプリケーションインスタンスを自動的に推論する方法がないため、いくつかの不都合が生じます。

おそらく将来的にはGHCので、1つのスーパークラスのインスタンスを明示する必要はありません

class Applicative m => Monad m where 
    return :: a -> m a 
    (>>=) :: m a -> (a -> m b) -> m b 
    default pure = return 
    default (<*>) = ap 

のようなものができるようになります。 Template Haskellをベースにしたものであっても、ライブラリライターはGHCにインスタンスを自動的に導出する方法を説明することができます(これは、現時点で実現可能です)。私たちは、GHC開発者からのものを見ていきます。

+1

今、別の方法では 'return = pure'というデフォルトがあります。 。将来的に ''純粋な ''の同義語だけを ''返す 'ようにする計画もあります。 –

2

GHCは、かなり良いので、Functorインスタンスを派生させることができます。しかし、Applicativeインスタンスを派生させる唯一の方法は、ここでは適用されない一般化newtype派生を使用することです。

関連する問題