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
Ö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)
Nasıl Parça ViewPager görünür olduğund...
Yüksek bir düzeyde, nasıl OAuth 2 çalı...
Nasıl HttpOnly çerezleri AJAX istekler...
Nasıl Dil ile çalıştırılabilir gemi.Ha...
&Quot;devam" anahtar kelime nedir...