まず、素敵な定義があります
x = 1 : map (2*) x
これまでに見たことがない場合、それ自体は少し心が折れます。とにかく、それは怠惰と再帰のかなり標準的なトリックです。次に、fix
とpoint-free-ify を使用して、明示的な再帰を削除します。
x = fix (\vs -> 1 : map (2*) vs)
x = fix ((1:) . map (2*))
次に行うことは、:
セクションを拡張して、map
不必要に複雑にすることです。
x = fix ((:) 1 . (map . (*) . (*2)) 1)
さて、今、その定数の2つのコピーがあり1
ます。それは決して行われないので、リーダーのアプリケーションを使用して重複を排除します。また、関数の構成は少しごみですので、(<$>)
可能な限り置き換えます。
x = fix (liftA2 (.) (:) (map . (*) . (*2)) 1)
x = fix (((.) <$> (:) <*> (map . (*) . (*2))) 1)
x = fix (((<$>) <$> (:) <*> (map <$> (*) <$> (*2))) 1)
次map
は、その呼び出しは読みすぎです。しかし、恐れることは何もありません。モナドの法則を使用して、少し拡張することができます。具体的には、fmap f x = x >>= return . f
ので、
map f x = x >>= return . f
map f x = ((:[]) <$> f) =<< x
ポイントフリー化して、に置き換え(.)
て(<$>)
から、いくつかの偽のセクションを追加できます。
map = (=<<) . ((:[]) <$>)
map = (=<<) <$> ((:[]) <$>)
map = (<$> ((:[]) <$>)) (=<<)
前のステップでこの方程式を代入します。
x = fix (((<$>) <$> (:) <*> ((<$> ((:[]) <$>)) (=<<) <$> (*) <$> (*2))) 1)
最後に、スペースバーを壊して素晴らしい最終方程式を作り出します
x=fix(((<$>)<$>(:)<*>((<$>((:[])<$>))(=<<)<$>(*)<$>(*2)))1)