2

recursion-schemesHaskellパッケージのこの非常に抽象的な再帰関数がどのように機能するか (または、実際には、それが何をするか!)を理解しようとしています -このファイルから:

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

特に、私が理解したいのgは、モナド型コンストラクターに言及している関数をどのように適用し、言及も依存もしていない型mの値を返すのですか? Haskell では任意のモナドからのエスケープは不可能だと思っていました。tm

最初にソース ファイルを Intero にロードして、そのポイント入力機能を使用しようとしましたが、その試みは失敗しました。

次に、 を使用して GHCi にロードし、GHCi を使用cabal replして型推論を支援し、定義のさまざまなビットをコメントアウトして、構成された関数を一度に 1 つずつ型を追跡しようとしました。しかし、 に到達したときfmap、何をコメントアウトすればよいかわかりませんでした。なぜなら、再帰a呼び出しのコメントを外して他のものをコメントアウトした場合、おそらくコンパイルすらできないと思ったからです。部分的にコメントアウトされたの定義a適切なタイプはありません。

4

1 に答える 1