は、私は(それが何をするか、実際に、または!)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
には正しいタイプがありません。
GHCにその型について尋ねるために、式の代わりに '_'を置くことができます。 – arrowd
そしてwrt。エスケープする: 't'は' Recursive'クラスのもので、 '* - > *'種類のものです。これは、gposproの戻り値の型が何かをエスケープしておらず、何かにラップされていることを示しています。おそらくモナドでしょうか。 – arrowd
@arrowd上記の型シグネチャは、 '* - > *'型の戻り値の型を持つことができないので不可能です。 –