SORU
18 EYLÜL 2008, PERŞEMBE


Y-kombinatorik nedir?

Y-kombinatorik bir "" şey. yan fonksiyonel comp-scı bir kavramdır Çoğu programcı bile onlar hakkında duydum eğer onlar kadar onlar hakkında bilmiyorum.

Y-kombinatorik nedir? Nasıl çalışır? Onlar için iyi nelerdir? Prosedürel dillerde yararlı?

CEVAP
18 EYLÜL 2008, PERŞEMBE


Y-kombinatorik ' (diğer fonksiyonlar üzerinde faaliyet gösteren bir fonksiyon) bu özyineleme sağlar, kendi içinde işlevini başvurabilirsiniz. "işlevsel Bilgisayar bilimi teorisiözyineleme yaygınlaştırırbunun uygulanması özetleme, ve böylece söz konusu işlevin gerçek işten ayrılması. Bir derleme zamanı özyinelemeli fonksiyon için bir ad gerek yok yararı ikramiyesi gibi. =)

Bu lambda functions destek diller içinde geçerlidir. Lambda expressiontabanlı doğa genellikle kendilerini bakın olur. Ve yol bir değişken bildirmek, buna bağlıyordum, sonra lambda atayarak bu çalışma, kendi kendini referans döngü tamamlamak için, kırılgan. Lambda değişken kopyalanabilir ve özgün değişken öz-referans tatili olarak yeniden atanır.

Y-combinators olan hantal uygulamak için, ve sık sık kullanın, static-typed dil (procedural languages sık), çünkü genellikle yazarak kısıtlamalar gerektiren bir sayıda bağımsız değişken için bir işlev sormak bilinen derleme zamanında. Bu y-kombinatorik bir kullanması gereken herhangi bir bağımsız değişken sayısı için yazılı olması gerektiği anlamına gelir.

Ne kadar C Y-Kombinatorik bir, kullanımı ve çalışma örneği aşağıda#.

Y-kombinatorik kullanarak "sıradışı" bir şekilde özyinelemeli bir fonksiyon inşa. bir içerir İlk önceden varolan bir işlevi yerine kendisini çağıran kod parçası olarak işlev yazmak gerekir:

// Factorial, if func does the same thing as this bit of code...
x == 0 ? 1: x * func(x - 1);

Sonra seni aramak için bir işlevi götüren bir fonksiyon haline çevirmek, ve bunun gibi bir işlevi. Bu işlev alır ve başka bir işlev neden olan bir operasyon gerçekleştirdiği için fonksiyonel denir.

// A function that creates a factorial, but only if you pass in
// a function that does what the inner function is doing.
Func<Func<Double, Double>, Func<Double, Double>> fact =
  (recurs) =>
    (x) =>
      x == 0 ? 1 : x * recurs(x - 1);

Şimdi bir fonksiyon alır ve başka bir işlevi bir faktör gibi görünüyor bu tür döndüren bir işlevi var, ama kendisi aramak yerine, bağımsız dış işlev geçirilen çağırır. Nasıl bu faktör yapmak mı? Kendi iç işlevi geçirir. Y-Kombinatorik, özyineleme tanıtabilirsiniz kalıcı bir isim, bir işlevi kalarak yapar.

// One-argument Y-Combinator.
public static Func<T, TResult> Y<T, TResult>(Func<Func<T, TResult>, Func<T, TResult>> F)
{
  return
    t =>  // A function that...
      F(  // Calls the factorial creator, passing in...
        Y(F)  // The result of this same Y-combinator function call...
              // (Here is where the recursion is introduced.)
        )
      (t); // And passes the argument into the work function.
}

Yerine faktöriyel kendisini arayıp, ne olur faktöriyel faktöriyel jeneratör çağıran (Y-Kombinatorik özyinelemeli çağrı tarafından döndürülen). Ve fonksiyon jeneratörü döndü t akım değerine bağlı olarak ya da jeneratör yeniden, t - 1 ile aramak ya da sadece 1, özyineleme sonlandırma dönecektir.

Karmaşık ve gizemli, ama zamanında sallar, ve onun çalışma anahtarıdır "ertelenen infaz" ve kırma aralığı için özyineleme iki fonksiyonları. İç Fbağımsız değişken olarak geçtibir sonraki tekrarda,. çağrılacak ^strong>gerekli ise.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Derek Banas

    Derek Banas

    12 AĞUSTOS 2008
  • Gavin Hoey

    Gavin Hoey

    21 Aralık 2007
  • SRI International

    SRI Internat

    30 NİSAN 2008