2016-04-13 10 views
0

私のコードを見てください。 GHCiのはハスケル、(インスタンスMの)インスタンスがありません

(ApplicativeのM)なしインスタンス は「モナドM」

のインスタンス宣言でインスタンス宣言 のスーパークラスに起因すると言われ、私はこのエラーを理解していない、と私はしないでくださいそれを修正する方法を知っている。私たちを手伝ってくれますか ?

newtype M a = StOut (Stack -> (a, Stack, String)) 

unStOut (StOut f) = f 
--unStout is used to extract the emeded function from monadic capsule 

instance Monad M where 
    return x = StOut (\n -> (x, n, "")) 
    e >>= f = StOut (\n -> let  (a, n1, s1) = (unStOut e) n 
            (b, n2, s2) = (unStOut (f a)) n1 
          in  (b, n2, s1++s2)) 
+2

http://stackoverflow.com/questions/31652475/defining-a-new-monad-in-haskell-raises-no-instance-for-applicative/31652592#31652592基本的に、GHC 7.10で変更されたルール – MathematicalOrchid

答えて

0

チェックアウトの定義Monad。長い話短い - Monadになるために、MApplicativeでなければなりません。これはMFunctorであることを必要とする。

これはエラーの内容です。

3

エラーはまさにそれが言っていることです:あなたはMにアプリケーションインスタンスを与えることを忘れました。

すべてのモナドは、適用ファンクタです。歴史的な事故では、過去にこの事実を明示する必要はありませんでしたが、これはジェネリックコードを書くときにあらゆる種類の不都合につながります。 The omission has since been fixedですので、Monadインスタンスを定義するには、先にFunctorApplicativeインスタンスを定義する必要があります。

+0

Canあなたは詳細を教えてくれますか? –

+0

'M 'の' Functor'と 'Applicative'インスタンスを定義する方法を説明しますか?私はできましたが、それはあなた自身を行う良い運動です。ただタイプを見てください。 'fmap'は通常実装が非常に簡単です(実際には、' -XDeriveFunctor'拡張がそれを実行できます)。 'pure'は' return'と同じです。唯一の難しいのは '<*>'ですが、これも実行可能でなければなりません。 (自分で定義することができない場合は、いつでも['(<*>)= ap']を使うことができます(http://hackage.haskell.org/package/base/docs/Control-Monad.html#v :ap)、モナドのインスタンスが既に終了している場合) – leftaroundabout