2016-09-25 9 views
2

は、私は(それが何をするか、実際に、または!)Haskellのrecursion-schemesパッケージから、この非常に抽象的再帰関数がどのように機能するかを理解しようとしています - this fileから:特にgpostproはどのように "モナドから脱出"しますか?

class Functor (Base t) => Corecursive t where 

    [...] 

    -- | A generalized postpromorphism 
    gpostpro 
    :: (Recursive t, Monad m) 
    => (forall b. m (Base t b) -> Base t (m b)) -- distributive law 
    -> (forall c. Base t c -> Base t c)   -- natural transformation 
    -> (a -> Base t (m a))      -- a (Base t)-m-coalgebra 
    -> a          -- seed 
    -> t 
    gpostpro k e g = a . return where a = embed . fmap (ana (e . project) . a . join) . k . liftM g 

、私が理解したいことは次のとおりです。モナド型のコンストラクタmを記述しているg関数をどのように適用しますか?mに言及していないか依存しているt型の値を返しますか?ハスケルでは、任意のモナドからの脱出は不可能だと思った!

私はまずソースファイルをInteroにロードして、タイプポイント・ポイント機能を使用しようとしましたが、その試みはfailedです。

次に、cabal replを使用してGHCiにロードし、GHCiを使用して一度に1つずつ、タイプの推論を助けるために、定義のさまざまなビットをコメントアウトすることによって、タイプに従って処理しようとしました。しかし、私がfmapに行ったときには、再帰的なa呼び出しをコメント解除して他のものをコメントアウトすると、部分的にコメントアウトされたの定義aには正しいタイプがありません。

+1

GHCにその型について尋ねるために、式の代わりに '_'を置くことができます。 – arrowd

+0

そしてwrt。エスケープする: 't'は' Recursive'クラスのもので、 '* - > *'種類のものです。これは、gposproの戻り値の型が何かをエスケープしておらず、何かにラップされていることを示しています。おそらくモナドでしょうか。 – arrowd

+1

@arrowd上記の型シグネチャは、 '* - > *'型の戻り値の型を持つことができないので不可能です。 –

答えて

2

私はghciを使って、サブ式のタイプを囲むことによってそれらが何であるか教えてもらえました( ... :: _)

が判明し、トリックは、「分配法則」kあなたは一時的Baseタイプの内側にモナドを突き出すすることを可能にされ、その後、embed方法を使用すると、一時的Baseタイプを不要とバックtに取得することができます。実際に具体的なタイプtIOが記述されていない場合は、IOモナドなどに(安全に)kを書くことは不可能です。したがって、ここでは魔法はありません。つまり、この関数を使用してIOのように避けられないようなモナドから脱出する方法はありません。

+0

答えとしてあなた自身の答えを記入してください。 – arrowd

関連する問題