[解決済み] 難読化されたHaskellのコードはどのように動作するのでしょうか?
質問
読書中 https://en.uncyclopedia.co/wiki/Haskell を読んでいるときに (そしてすべての不快なものを無視して)、次のような難読化されたコードの断片に出くわしました。
fix$(<$>)<$>(:)<*>((<$>((:[{- thor's mother -}])<$>))(=<<)<$>(*)<$>(*2))$1
の中でこのコードを実行すると
ghci
(をインポートした後)。
Data.Function
と
Control.Applicative
),
ghci
は2のすべての累乗のリストを表示します。
このコード片はどのように動作するのでしょうか?
どのように解決するのですか?
まず最初に、私たちは美しい定義を持っています。
x = 1 : map (2*) x
というのは、それ自体、見たことがなければちょっとびっくりするようなものです。とにかく、これは怠惰と再帰のかなり標準的なトリックなのです。さて、次は明示的な再帰を取り除くために
fix
を使用して明示的な再帰を取り除き、ポイントフリー化します。
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)
関連
-
[解決済み】haskellでリストを逆順にする
-
[解決済み] Haskellです。パターンでのパースエラー
-
[解決済み] Haskellは実世界で何に使われているのか?[クローズド]
-
[解決済み】代数的なデータ型の代数を悪用する - なぜこれが有効なのか?
-
[解決済み】Haskellの宣言におけるエクスクラメーションマークの意味とは?
-
[解決済み] Haskellで副作用がモナドとしてモデル化されているのはなぜですか?
-
[解決済み】Haskell/GHCの`forall`キーワードは何をするのですか?
-
[解決済み] Haskellのprintfはどのように動作するのですか?
-
[解決済み] HaskellのComonad型クラスとは何ですか?
-
[解決済み] Haskellのドット演算子:もっと説明が欲しい
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Haskellは実世界で何に使われているのか?[クローズド]
-
[解決済み] 制約条件付き特殊化
-
[解決済み] TLSサーバーを実装するためのHsOpenSSL APIの適切な使用法
-
[解決済み] GHCでコンパイルした小さなHaskellプログラムを巨大なバイナリにする
-
[解決済み] Haskellデータ型のメモリフットプリント
-
[解決済み] アプリケートは合成し、モナドは合成しない
-
[解決済み] Haskell エラー 入力 `=' のパースエラー
-
[解決済み] fixの使い方、効果について教えてください。
-
[解決済み] Haskellのドット演算子:もっと説明が欲しい
-
[解決済み] Haskell: なぜヘルパー関数に "go" という名前を付けるのですか?