SORU
30 EYLÜL 2012, Pazar


Nasıl karıştırılmış Haskell parça bu kod çalışıyor mu?

http://uncyclopedia.wikia.com/wiki/Haskell (ve tüm "pis" şeyler), üzerine karıştırılmış aşağıdaki kod parçası buldum: . görmezden okurken

fix$(<$>)<$>(:)<*>((<$>((:[{- thor's mother -}])<$>))(=<<)<$>(*)<$>(*2))$1

Çalıştırdığımda ghci kod parçasının (Data.Function Control.Applicative aldıktan sonra), ghci 2 tüm güçler listesini yazdırır.

Bu kodu nasıl baş belası mı?

CEVAP
30 EYLÜL 2012, Pazar


Öncelikle, güzel bir tanımı var

x = 1 : map (2*) x

kendisi biraz eğer daha önce gördüysen zihin bükme. Neyse tembellik ve özyineleme oldukça standart bir numara. Şimdi, açık özyineleme fix kullanarak kurtulmak ve özgür-bir noktaya geleceğiz.

x = fix (\vs -> 1 : map (2*) vs)
x = fix ((1:) . map (2*))

Yapacağımız bir sonraki şey : bölümünü genişletin ve map gereksiz yere karmaşık hale getirilmesidir.

x = fix ((:) 1 . (map . (*) . (*2)) 1)

Artık sürekli iki kopyası var 1. Bu hiç de-yinelenen okuyucu uygulamalı kullanacağız bunu. Ayrıca, işlev kompozisyon biraz saçmalık, biz her yerde (<$>) ile değiştirin.

x = fix (liftA2 (.) (:) (map . (*) . (*2)) 1)
x = fix (((.) <$> (:) <*> (map . (*) . (*2))) 1)
x = fix (((<$>) <$> (:) <*> (map <$> (*) <$> (*2))) 1)

Sıradaki: map bu ara çok okunabilir. Ama korkacak bir şey yok: monad yasaları biraz genişletmek için kullanabiliriz. Yani, fmap f x = x >>= return . f özellikle

map f x = x >>= return . f
map f x = ((:[]) <$> f) =<< x

-Serbest bir işaret, (<$>) ile (.) değiştirmek ve bazı sahte bölümler ekleyin:

map = (=<<) . ((:[]) <$>)
map = (=<<) <$> ((:[]) <$>)
map = (<$> ((:[]) <$>)) (=<<)

Bizim önceki adımda bu denklemi değiştirme:

x = fix (((<$>) <$> (:) <*> ((<$> ((:[]) <$>)) (=<<) <$> (*) <$> (*2))) 1)

Son olarak, boşluk ve sonu harika son denklem üretmek

x=fix(((<$>)<$>(:)<*>((<$>((:[])<$>))(=<<)<$>(*)<$>(*2)))1)

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Codecourse

    Codecourse

    3 ŞUBAT 2009
  • sonia989

    sonia989

    26 EKİM 2006
  • Tomas N

    Tomas N

    14 Kasım 2010