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 maprumit 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 mapitu 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)