Örnek vermek gerekirse, böyle bir veri türünün herhangi bir türden birinde oturmamıza izin verdiği örnek Turner, D.A. (2004-07-28), Total Functional Programming, tarikat. 3.1, sayfa 758 yılında Kural 2: Tip tekrarlama eşdeğişkin olmalıdır kötü 'özyinelemeli veri türü
data Bad a = C (Bad a -> a)
"
Biz başlayacağız en Haskell kullanarak daha ayrıntılı bir örnek yapalım.'.
ve yineleme diğer herhangi bir şekilde olmadan ondan Y combinator oluştururlar. Bu tür bir veri türü olan yineleme herhangi bir yapı ya da sonsuz bir yineleme ile her tür yaşayan bize izin verdiği anlamına gelir.
Türlenmemiş lambda Diferensiyel
The Y combinator bu anahtarı, x x
kendisi için x
geçerli olduğunu
Y = λf.(λx.f (x x)) (λx.f (x x))
olarak tanımlanır. Yazılan dillerde, bu doğrudan mümkün değildir, çünkü geçerli bir x
türü olabilir. Ama Bad
veri türü bu modülo yapıcısı ekleme/kaldırma sağlar:
selfApp :: Bad a -> a
selfApp ([email protected](C x')) = x' x
, biz onun yapıcı paketini ve kendisi x
için içeri işlevini uygulayabilirsiniz x :: Bad a
almak. Biz bunun nasıl öğrendiğinizde, Y bağdaştırıcının inşa etmek kolaydır: ne selfApp
ne de yc
özyinelemeli olduğunu
yc :: (a -> a) -> a
yc f = let fxx = C (\x -> f (selfApp x)) -- this is the λx.f (x x) part of Y
in selfApp fxx
Not, kendisine bir fonksiyonun hiçbir özyinelemeli çağrı var. Özyineleme sadece özyinelemeli veri türümüzde görünür.
Yapılı birleştiricinin gerçekte ne yapması gerektiğini kontrol edebiliriz. en GCD diyelim
loop :: a
loop = yc id
veya hesaplamak: o türsüz lambda hesabının bir gömme olması ile Verdiğin
gcd' :: Int -> Int -> Int
gcd' = yc gcd0
where
gcd0 :: (Int -> Int -> Int) -> (Int -> Int -> Int)
gcd0 rec a b | c == 0 = b
| otherwise = rec b c
where c = a `mod` b
Güzel cevap. Bu zarif yaklaşımı, teorik açıklamasından (yazılmamış lambda hesabı) gömdüm. Söz konusu dile keyfi bir özendirme yapması için onu genişletmek mümkün olabilir mi (Agda hadi söyleyelim)? –
@ PetrPudlák Öyleyse, ben daha iyi tip teorisyenler benden daha uzakta olan memurlarımla sohbet ettim. Mutabakat, bu 'Kötü' bir tür terime sebep olmazdı. a '(gerçekten önemsediğin şey budur; özyineleme, sadece oraya ulaşmaktır). Tartışma şöyle olurdu: Bir dizi kuramsal model olan Agda kurabilirsiniz; o zaman bu modele bir tek eleman kümesi olarak "Bad" in bir yorumunu ekleyebilirsin; sonuçta ortaya çıkan modelde hala ıssız türler olduğu için, 'Bad' terimlerini başka türdeki döngü koşullarına çeviren hiçbir işlev yoktur. –