SORU
16 AĞUSTOS 2014, CUMARTESİ


Demet oluşturma bu deyim için bir isim var mı?

Boost mailinglist, demet gibi bir varlık yaratmak için aşağıdaki zekice bir hile geçenlerde @LouisDionne tarafından yayınlanmıştır:

#include <iostream>

auto list = [](auto ...xs) { 
    return [=](auto access) { return access(xs...); }; 
}; 

auto length = [](auto xs) { 
    return xs([](auto ...z) { return sizeof...(z); }); 
};

int main()
{
    std::cout << length(list(1, '2', "3")); // 3    
}

Live Example.

Bu zeka list lambda parametre-listesine girdi olarak bir variadic alarak ve başka bir lambda onun giriş göre hareket sürecek bir çıkış olarak bir lambda dönüyor. Benzer şekilde, length lambda liste orijinal giriş parametreleri sizeof... variadic operatör kaynağı olacak gibi liste varlık, alıyor. sizeof... operatör list geçirilebilir böylece lambda içine sarılmıştır.

Soru: demet oluşturma bu deyim için bir isim var mı? Belki de üst düzey fonksiyonel bir programlama dili fonksiyonları daha yaygın olarak kullanılır.

CEVAP
16 AĞUSTOS 2014, CUMARTESİ


Bu Monad-gibi bir şey, devam monad aynı ruhu içinde özellikle bir şey ince bir uygulama olduğunu düşünüyorum.

Monadlar fonksiyonel programlama yapımı bir hesaplama farklı adımları (fonksiyonel bir dil vatansız olduğunu Unutmayın) arasındaki durumunu simüle etmek için kullanılır.
Bir monad ne farklı işlevleri, bir zincir oluşturmak için< . em^"" . hesaplama boru hattı her adım hesaplama mevcut durumu hakkında bilir nerede.

Monadlar iki temel pilars var:

  • Bir dönüş değeri alır ve Monad hazır bir biçimde döndüren fonksiyon.
  • Bir bağlama Monad-hazır değeri (önceki boru hattı adımdaki) alır ve kendi özgün için yeteneğini inceliyor, hangi işlevi, bir sonraki adım için değer vermek.

The Wikipedia monadlar hakkında çok güzel örnekler ve açıklamalar var.

Bana C 14 kod verildi: yeniden izin verin

auto list = []( auto... xs ) 
{ 
    return [=]( auto access ) { return access(xs...); };
};

Burada bir monad return fonksiyonu belirliyoruz sanırım: değerini Alır ve Monadic bir şekilde döner. Özellikle, bu iade gelen giden bir functor (matematiksel anlamda, bir C functor değil) "" variadic pack kategori kategori. demet döndürür

auto pack_size = [](auto... xs ) { return sizeof...(xs); };

pack_size sadece normal bir işlevdir. Bazı işler yapmak için bir boru hattı kullanılacak.

auto bind = []( auto xs , auto op ) 
{
    return xs(op);
};

length sadece bir genel olmayan sürüm bir şey yakın monad bind operatör, operatör de bir monadic değeri bir önceki boru hattı adım, ve atlar için belirtilen işlev (Fonksiyon gerçekten yaptığı iş). Bu işlev bu işlev hesaplama adım tarafından yapılır.

Son olarak senin dediğin gibi tekrar yazılabilir:

auto result = bind(list(1,'2',"3"), pack_size);

Yanibu kayıt düzeni oluşturma adına deyim nedir?Peki, bu denilebilir bence "monad gibi dizilerini"benzer bir şekilde tam bir monad, ama dizi gösterimi ve genişletme çalışmalarını beri, Haskell devam monad kalan.

Edit: Daha eğlenceli

Sadece komik C programlama sallamak için, monad, böyle bir şeye keşfetmek takip ettim. Bazı örnekler here bulabiliriz.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Avast

    Avast

    27 NİSAN 2006
  • FamilyFeud

    FamilyFeud

    22 AĞUSTOS 2006
  • Phymec

    Phymec

    18 Temmuz 2009