http://blog.sumtypeofway.com/recursion-schemes-part-2/の一部を読んだ (および実装した) 後 でも、関数の型がどのようにcata
機能するのか疑問に思っています。cata
関数は次のように定義されます。
mystery :: Functor f => (f a -> a) -> Term f -> a
mystery f = f . fmap (mystery f) . unTerm
のようなものがありTerm Expr
ます。開梱後、Expr (Term Expr)
. 代数 ( f
) は、たとえば として定義されf :: Expr Int -> Int
ます。以下を簡単に呼び出すことができることはわかっています。
x = Literal "literal" :: Expr a
f :: Expr Int -> Int
f x :: Int
私はまた想像することができます:
x = Literal "literal" :: Expr (Term Expr)
f :: Expr a -> Int
f x :: Int
しかし、次のことはうまくいかないと思います:
x = Literal "literal" :: Expr (Term Expr)
f :: Expr Int -> Int
f x :: ???
ただし、cata
関数でどのように機能するかはまだわかりませExpr (Term Expr)
んExpr a
。値が機能することは理解していますが、型がわかりません。ツリーの葉で何が起こるのでしょうか? これは確かにmystery
...
編集:理解できないことをより明確に述べようとします。
精神的には、次のcata
ように機能するようです。
fmap f
葉に適用します。- これで、持っているノードを
Expr Int
呼び出して、上に行くことができます。fmap f
私が申請しているので、明らかにこのようには機能しませんfmap (cata f)
。ただし、最終的に関数は引数として (リーフで)f
呼び出されます。Expr Int
このタイプExpr (Term Expr)
は以前のものからどのように作られたのですか?