[解決済み] fixの使い方、効果について教えてください。
質問
のドキュメントを読んでいて、ちょっと混乱しました。
fix
のドキュメントを読んで少し混乱したので (今となっては何をするものなのか理解しているつもりですが)、ソースコードを見てみました。 それは私をさらに混乱させたままにしておきました。
fix :: (a -> a) -> a
fix f = let x = f x in x
これは具体的にどのように定点を返すのでしょうか?
コマンドラインで試してみることにしました。
Prelude Data.Function> fix id
...
そして、そこでハングアップします。 公平を期すために、これは私の古いマックブック上で、ちょっと遅いです。 しかし、この関数は も というのは、idに渡されたものはすべて同じものを返してくれるからです(言うまでもなく、CPU時間はまったく消費しません)。 私は何を間違えているのでしょうか?
どのように解決するのですか?
あなたは何も間違っていません。
fix id
は無限ループです。
というとき
fix
が関数の最小固定点を返すとすると、その関数の
領域理論
の意味で使われます。 ですから
fix (\x -> 2*x-1)
は
ではなく
を返します。
1
を返さないからです。
1
はその関数の固定点であるが、それは
最小
であり、領域順序の
ドメインオーダーを1、2段落で説明することはできませんので、上記のドメイン理論のリンクを参照してください。 これは素晴らしいチュートリアルで、読みやすく、かなり啓発的です。とてもお勧めです。
10,000フィートからの眺めのために。
fix
は高次の関数であり、これは
再帰
. もし、式があれば
let x = 1:x in x
この結果、無限リスト
[1,1..]
を使っても同じことが言えます。
fix
:
fix (\x -> 1:x)
(あるいは、単に
fix (1:)
の固定点を見つけてくださいということです。
(1:)
関数の固定点、つまり値
x
というのは
x = 1:x
... ちょうど上で定義したように。 定義からわかるように
fix
はこのアイデア、つまり関数にカプセル化された再帰にほかなりません。
これは再帰の本当に一般的な概念でもあり、どんな再帰関数もこの方法で書くことができます。 多相再帰を使用する関数も含め . 例えば、典型的なフィボナッチ関数がそうです。
fib n = if n < 2 then n else fib (n-1) + fib (n-2)
を使って書くことができます。
fix
のように書くことができます。
fib = fix (\f -> \n -> if n < 2 then n else f (n-1) + f (n-2))
練習問題
fix
の2つの定義が同じであることを示すために
fib
は等価であることを示す。
しかし、完全に理解するためには、領域理論について読んでください。 本当にクールなものです。
関連
-
[解決済み】Haskellでの挿入ソート
-
[解決済み] 一般的に `{- |` で始まるHaskellのコメントは何を意味するのですか?
-
[解決済み] .の違いは何ですか?(ドット)と$(ドルマーク)の違いは何ですか?
-
[解決済み】代数的なデータ型の代数を悪用する - なぜこれが有効なのか?
-
[解決済み] IntとIntegerの違いは何ですか?
-
[解決済み] ハスケル Where vs. Let
-
[解決済み] Haskellの関数合成(.)と関数応用($)イディオム:正しい使い方
-
[解決済み] HaskellとF#の主な違いは何ですか?[クローズド]
-
[解決済み] このフィボナッチ関数はどのようにメモされているのですか?
-
[解決済み] Haskellの「何もしない」関数、idはなぜ大量のメモリを消費するのか?
最新
-
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 Preludeの'const'は何のためにあるのか?
-
[解決済み] Haskell タプルをリスト化する?
-
[解決済み] Hindley-Milnerのどの部分が理解できないのでしょうか?
-
[解決済み] Haskellにはなぜ "data "と "newtype "があるのですか?重複] [重複] [重複
-
[解決済み] Haskellのリストを参照する際の「@」記号の意味は?
-
[解決済み] Haskellでグラフはどのように表現するのか?
-
[解決済み] Haskellのガードとif-then-elseとcaseの比較
-
[解決済み] Haskellの派生はどのように行われるのですか?
-
[解決済み] Haskellのprintfはどのように動作するのですか?
-
[解決済み] Haskell の現在のモジュールにインポートモジュールを追加してエクスポートする。