Mu
は、折り返しとして再帰型を表し、Nu
は展開されたものとして表します。ハスケルでは、これらは同形であり、同じ型を表す異なる方法です。 Haskellに任意の再帰がないと思われる場合、これらの型の区別はより面白くなります。Mu f
は、最小(初期)の固定小数点がf
であり、Nu f
が最大固定小数点です。
はf
の固定点、すなわち逆関数in :: f T -> T
、out :: T -> f T
一対の種類T
T
とf T
の間に同型です。タイプFix
は、Haskellの組込み型再帰を使用して、同形を直接宣言します。しかし、Mu
とNu
の両方でイン/アウトを実装できます。
具体的な例として、再帰的な値を書くことができないようなふりをする。 Mu Maybe
の住民、すなわち値:: forall r. (Maybe r -> r) -> r
は、自然人、{0,1,2、...}である。 Nu Maybe
の住人、すなわち値:: exists x. (x, x -> Maybe x)
は、共生体{0,1,2、...、∞}である。これらのタイプの可能な値を考えて、なぜNu Maybe
に余分な住人がいるのかを確認してください。
あなたはこれらのタイプのいくつかの直感を取得したい場合は、(大体難易度の増加順に)再帰せずに次のことを実現するための楽しいエクササイズになります
zeroMu :: Mu Maybe
、succMu :: Mu Maybe -> Mu Maybe
zeroNu :: Nu Maybe
、 succNu :: Nu Maybe -> Nu Maybe
、inftyNu :: Nu Maybe
muTofix :: Mu f -> Fix f
、fixToNu :: Fix f -> Nu f
inMu :: f (Mu f) -> Mu f
、outMu :: Mu f -> f (Mu f)
inNu :: f (Nu f) -> Nu f
、outNu :: Nu f -> f (Nu f)
またこれらを実装しようとすることができますが、彼らは再帰が必要です。
nuToFix :: Nu f -> Fix f
、fixToMu :: Fix f -> Mu f
Mu f
は最小不動点である、とNu f
です最大のので、関数を書くこと:: Mu f -> Nu f
は非常に簡単ですが、関数を書くこと:: Nu f -> Mu f
は難しいです。それは現在と泳ぐようなものです。 (私はこれらのタイプのより詳細な説明を記述することを意味した1点で、それは、この形式のために少し長すぎるかもしれません。)
私はあまり理論を知らないが、私はそれを集めますより校正的な言語の場合、「Mu」は最も固定されていない点であり、「ヌ」は最も大きな固定点である。ハスケルでは、これらの3つはすべて同等であると考えられています(私は信じています)。''ヌ 'の '' Mu''と '' ana''のために '' cata'を実装するのは非常に簡単です。 – dfeuer
このkataを解決しようとするhttps://www.codewars.com/kata/folding-through-a-fixed-point/haskell – xgrommx