2017-02-06 11 views
1

私はgiven次のクラスインタフェースしてきた:一般的なネストされたモナド操作ですか?

class Misty m where 
    banana :: (a -> m b) -> m a -> m b 
    unicorn :: a -> m a 

そして今、私は有効にするために、これを修正するために必要だ:

jellybean :: (Misty m) => m (m a) -> m a 

私は質問がのサブクラスを追加するために私を推進していると考えていますMisty、マルチパラメータで:

class Misty m => VeryMisty m a where 
    ... banana' (Just (Just v)) = banana --? 

私はMistyにして関数を作成する方法がわかりませんよこのネストされたモナドを操作しますか?

私のアプローチが正しいのか、最も単純なのかがわかりませんか?

+1

「バナナ」と「ユニコーン」の意味で「ゼリービーン」を定義するだけだと思います – Euge

+1

「ミスティ」は「モナド」、「バナナ」は「= <<」です= ')、' unicorn'は 'return'、' jellybean'は 'join'ですよね? – chepner

答えて

5

私はあなたがクラスを拡張する必要はないと思う、またはサブクラスを追加します。考えてみましょうbananaの型シグネチャを使用すると、(m aのためにもa変数は、あらゆるタイプのために立つことができるタイプなので)bananaの署名にaためm aを選ぶならばどのようなものか:あなたがいることがわかり

banana :: Misty m => (m a -> m b) -> m (m a) -> m b 

いますこれはすでにjellybeanのかなり近くに見え始めますか?最初の引数を "取り除いて" baと同じにするだけです。これを達成する最も簡単な方法は、恒等関数id使用することです:

jellybean :: (Misty m) => m (m a) -> m a 
jellybean x = banana id x 

第二のステップを参照するには良い方法をより簡単であるあなたがbananaの第二としてjellybeanに最初の引数を使用することができることを発見したら、 型付き穴使用することです:REPLにロードでは、これを

jellybean :: (Misty m) => m (m a) -> m a 
jellybean x = banana _ x 

を、Haskellはプリントアウトします:

Found hole `_' with type: m a -> m a 

ここで、この文脈でこの型チェックを行うために必要なものがわかります。

関連する問題