Pertama-tama, kami memiliki definisi yang indah
x = 1 : map (2*) x
yang dengan sendirinya agak membingungkan jika Anda belum pernah melihatnya sebelumnya. Pokoknya itu trik kemalasan dan rekursi yang cukup standar. Sekarang, kita akan menghilangkan penggunaan rekursi eksplisit fix
, dan point-free-ify.
x = fix (\vs -> 1 : map (2*) vs)
x = fix ((1:) . map (2*))
Hal berikutnya yang akan kita lakukan adalah memperluas :
bagian tersebut dan menjadikannya map
rumit yang tidak perlu.
x = fix ((:) 1 . (map . (*) . (*2)) 1)
Nah, sekarang kita memiliki dua salinan dari konstanta itu 1
. Itu tidak akan pernah berhasil, jadi kami akan menggunakan aplikasi pembaca untuk menghilangkan duplikatnya. Selain itu, komposisi fungsi agak sedikit sampah, jadi mari kita ganti dengan apa (<$>)
pun yang kita bisa.
x = fix (liftA2 (.) (:) (map . (*) . (*2)) 1)
x = fix (((.) <$> (:) <*> (map . (*) . (*2))) 1)
x = fix (((<$>) <$> (:) <*> (map <$> (*) <$> (*2))) 1)
Selanjutnya: panggilan ke map
itu terlalu mudah dibaca. Tapi tidak ada yang perlu ditakuti: kita bisa menggunakan hukum monad untuk mengembangkannya sedikit. Secara khusus fmap f x = x >>= return . f
, jadi
map f x = x >>= return . f
map f x = ((:[]) <$> f) =<< x
Kita dapat point-free-ify, menggantinya (.)
dengan (<$>)
, dan kemudian menambahkan beberapa bagian palsu:
map = (=<<) . ((:[]) <$>)
map = (=<<) <$> ((:[]) <$>)
map = (<$> ((:[]) <$>)) (=<<)
Mengganti persamaan ini di langkah sebelumnya:
x = fix (((<$>) <$> (:) <*> ((<$> ((:[]) <$>)) (=<<) <$> (*) <$> (*2))) 1)
Akhirnya, Anda mematahkan bilah spasi dan menghasilkan persamaan akhir yang indah
x=fix(((<$>)<$>(:)<*>((<$>((:[])<$>))(=<<)<$>(*)<$>(*2)))1)