yılında Fix, Mu ve Nu arasındaki fark üç beyanlar Ne var olan nedir?Ed Kmett en <code>recursion-scheme</code> pakette Ed Kmett en tekrarlama düzeni paketinde
cevap
Mu
, katlama olarak yinelemeli bir türü temsil eder ve Nu
, açıldığını gösterir. Haskell'de, bunlar izomorftur ve aynı türü temsil etmenin farklı yollarıdır. Eğer Haskell'in keyfi bir özyinelemeye sahip olmadığını iddia ediyorsanız, bu türler arasındaki ayrım daha ilginç hale gelir: Mu f
en az (başlangıç) f
sabit noktasıdır ve Nu f
en büyük (uçbirim) sabit noktasıdır.
f
sabit bir nokta, yani ters fonksiyonlar in :: f T -> T
, out :: T -> f T
bir çift tip T
T
ve f T
arasında bir izomorfizm vardır. Fix
tipi sadece, doğrudan izomorfizmi ilan etmek için Haskell'in yerleşik tipi özyinesini kullanır. Ancak hem Mu
hem de Nu
için giriş/çıkış yapabilirsiniz.
Somut bir örnek için, bir an için yinelemeli değerler yazamayacağınızı varsayın. Mu Maybe
, yani :: forall r. (Maybe r -> r) -> r
değerlerine sahip olanlar, doğal olanlardır, {0, 1, 2, ...}; Nu Maybe
'un sakinleri, yani :: exists x. (x, x -> Maybe x)
değerleri, {0, 1, 2, ..., ∞} conaturallarıdır. Nu Maybe
'un neden fazladan bir sakinin olduğunu görmek için bu türlerin olası değerlerini düşünün.
bu türleri için bazı sezgi almak istiyorsanız, bir eğlence egzersiz (kabaca zorluk artan sırada) özyineleme olmadan aşağıdakileri uygulamak olabilir:
zeroMu :: 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)
succMu :: Mu Maybe -> Mu Maybe
Ayrıca şu uygulamaya çalışıyorum, ama onlar Özyinelemeyi gerektirir:
nuToFix :: Nu f -> Fix f
,fixToMu :: Fix f -> Mu f
Mu f
az sabit noktasıdır ve Nu f
olduğunu En büyük, bu yüzden :: Mu f -> Nu f
bir fonksiyon yazmak çok kolay, ama bir fonksiyon yazıyor :: Nu f -> Mu f
serttir; Akıma karşı yüzmek gibi.
(az bir nokta ben bu tür daha ayrıntılı bir açıklama yazmak için anlamı, ama o bu biçim için biraz fazla uzun olabilir.)
çok fazla teori bilmiyorum, ama ben toplamak Daha fazla ispatlama dili için, 'Mu' en az sabit nokta ve 'Nu' en büyük sabit nokta. Haskell'de, bu üçünün hepsinin eşdeğer olması gerekiyordu (inanıyorum).Nu' için 'Mu' ve' ana' için 'cata'ı uygulamak çok kolay olduğunu unutmayın. – dfeuer
Bu kata https://www.codewars.com/kata/folding-through-a-fixed-point/haskell'i çözmeye çalışın – xgrommx