Bunu hiç anladığımı iddia etmiyorum, ama eğer bu birine yardım ederse ... o zaman yippee.
Tanımını düşünün fix
. fix f = let x = f x in x
. Akıllara durgunluk veren kısım, şu x
şekilde tanımlanmaktadır f x
. Ama bir dakika düşünün.
x = f x
X = fx x
olduğuna göre, bunun sağ tarafındaki değerini değiştirebiliriz , değil mi? Yani bu nedenle...
x = f . f $ x
x = f . f . f $ x
x = f . f . f . f . f . f . f . f . f . f . f $ x
Öyleyse işin püf noktası, sona erdirmek için, f
bir tür yapı oluşturmak zorundadır, böylece daha sonra f
bu yapıyı eşleştirebilir ve parametresinin (?) Tam "değerini" umursamadan yinelemeyi sonlandırabilir
Tabii ki luqui'nin gösterdiği gibi sonsuz bir liste oluşturmak gibi bir şey yapmak istemiyorsan.
TomMD'nin faktöriyel açıklaması iyidir. Düzeltmenin tür imzası (a -> a) -> a
. Tip imzası (\recurse d -> if d > 0 then d * (recurse (d-1)) else 1)
olan (b -> b) -> b -> b
, başka bir deyişle, (b -> b) -> (b -> b)
. Yani bunu söyleyebiliriz a = (b -> b)
. Bu şekilde, bir düzeltmedir bizim fonksiyonunu alır a -> a
, ya da gerçekten (b -> b) -> (b -> b)
ve türünde bir sonuç dönecek a
, başka bir deyişle, b -> b
başka bir deyişle, başka bir işlev!
Bekle, sabit bir noktaya dönmesi gerektiğini sanıyordum ... bir fonksiyon değil. Evet, öyle (çünkü fonksiyonlar veri). Bize bir faktöriyel bulma konusunda kesin bir işlev verdiğini hayal edebilirsiniz. Ona nasıl tekrarlanacağını bilmeyen bir fonksiyon verdik (bu nedenle parametrelerinden biri tekrarlamak için kullanılan bir fonksiyondur) ve fix
ona nasıl tekrarlanacağını öğrettik.
Bunun bir f
tür yapı oluşturması gerektiğini söylediğimi hatırlıyor f
musunuz, böylece daha sonra örüntü eşleşip sonlanabilir mi? Bu tam olarak doğru değil sanırım. TomMD x
, işlevi uygulamak ve temel duruma doğru adım atmak için nasıl genişleyebileceğimizi gösterdi. İşlevi için, eğer / o zaman kullandı ve feshin nedeni budur. Tekrarlanan değiştirmelerden sonra in
, tüm tanımın bir kısmı fix
sonunda terimleriyle tanımlanmayı durdurur x
ve bu, hesaplanabilir ve tamamlandığında gerçekleşir.
fix error
ghci yazabilir ve kendiniz hakkında iyi hissedebilirsiniz."