2016-09-14 4 views
8

私は、HaskellライブラリControl.Monad.Freeからhoistfree関数に関するいくつか質問があります。 2つのファンクタの間の変換fが与えられた場合、ホイストフリーfは対応するフリーモナドの間にモーフィズムを生成する。ここにその定義があります。hoistfreeの定義

hoistFree :: Functor g => (forall a. f a -> g a) -> Free f b -> Free g b 
hoistFree _ (Pure a) = Pure a 
hoistFree f (Free as) = Free (hoistFree f <$> f as) 

質問1どのようにHaskellは<$>gにないfFree fまたはFree gに関連したマップであることを知っていますか? hoistfreeが

hoistFree :: Functor g => (forall a. f a -> g a) -> Free f b -> Free g b 
hoistFree _ (Pure a) = Pure a 
hoistFree f (Free as) = Free (f (hoistFree f <$> as)) 

として定義されていないのはなぜ

質問2

fが自然な変換である場合、これら2つの定義は一致します。しかし、第2の定義は、常に関係を満足する。

hoistfree f = iter (wrap . f) . map return 

これはかなり自然に見える。さらに、iter_map f g = iter f . map gを使用して表現できる基本的な機能がいくつかあります。例えば、

(=<<) f = iter_map wrap f 

質問3はiter_mapどこかで定義されていますか?それはモナドのmapreduceのように見えます。私はベースライブラリでそれを見ませんでした。融合と写像に何らかの利得がありますか?他のいくつかの言語では、これが当てはまりますが、私はHaskellについてはわかりません。ためgから<$>を選択する型推論、の

+0

'hoistFree'の定義上のFunctorの制約は間違っていますか?推論型は 'Functor f =>(f(Free g a) - > g(Free g a)) - > Free f a - > Free g a'です。 – Michael

+0

@マイケルなぜ私はより広いタイプが推定されないのか分かりません。これは私にとって謎です。 – stackman

+0

タイプ推論はランク2タイプを推論しませんか、それとも意味ですか?これは、より多くの場合に適用されるという意味での「ワイドタイプ」です。 – Michael

答えて

5

質問1

。実際、

Free (hoistFree f <$> f as) 

f asg <something>型を持つ、したがって<$>Functor gによって与えられたものです。

質問2

私はHaskellで、fは常に自然形質転換である、ということだと思います。任意の多形関数f a -> g aは、パラメトリシティ/フリー定理によってaに自然でなければなりません。 両方の定義が同等であるため、いずれかが「最良」であるかどうかはわかりません。多分あなたのものです。あるいは、元のものが実際にはより良い性能を持っているかもしれません。連想演算子ではfoldrfoldl'の引数があり、明確な勝者はありません。

質問3いいえ、考えられません。

+0

答えをありがとう。しかし、たとえfが常に数学的に言えば自然な変換であっても、それを実装するための非等価な方法がいくつか存在するかもしれない。 [この投稿](http://blog.sigfpe.com/2008/02/how-many-functions-are-there-from-to.html)。 – stackman

+0

@stackman本当です。他の誰かがより多くの洞察を提供するかもしれません。より高度な機能の正確な厳密さレベルを理解することは非常に困難です。 – chi