recursion-schemes
Haskellパッケージのこの非常に抽象的な再帰関数がどのように機能するか (または、実際には、それが何をするか!)を理解しようとしています -このファイルから:
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 では任意のモナドからのエスケープは不可能だと思っていました。t
m
最初にソース ファイルを Intero にロードして、そのポイント入力機能を使用しようとしましたが、その試みは失敗しました。
次に、 を使用して GHCi にロードし、GHCi を使用cabal repl
して型推論を支援し、定義のさまざまなビットをコメントアウトして、構成された関数を一度に 1 つずつ型を追跡しようとしました。しかし、 に到達したときfmap
、何をコメントアウトすればよいかわかりませんでした。なぜなら、再帰a
呼び出しのコメントを外して他のものをコメントアウトした場合、おそらくコンパイルすらできないと思ったからです。部分的にコメントアウトされたの定義a
適切なタイプはありません。