問題タブ [fixpoint-combinators]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - 定点までの反復アクションの型クラス
特定の効果がなくなるまでアクションを実行するという一般的なパターンに気付きましたが、これは固定点を意味する (つまり、将来の効果はあり得ない) ことがわかっている場合です。これには型クラスがありますか?
これはMonadFixでカバーされていますか? コードを見るとそのように見えますが、 wiki ページで「「再帰」を見て、アクションを再帰的にまたは繰り返し実行することを意味すると推測したくなります。いいえ。」に怖がっていました。
また、不動点は恒等の双対のようなものだと私には思えます。つまり、同一性は、非同一性 ((+) の場合は 0、(*) の場合は 1、追加の場合は [] など) と組み合わせると消えます。一方、固定点は、以下の「リラックス」操作で非固定点を非表示にします。この双対性を形式化する方法はありますか?そうすると便利ですか? つまり、MonadPlus および/または Monoid と MonadRelax の間に関係はありますか?
最後に、リラックスはほぼ展開/アナモフィズムであることに気付きました。と表現した方が良いでしょうか?
haskell - 型理論におけるミュー (μ) 束縛の範囲
Haskell のリストは次のようになります。
型理論の解釈は次のとおりです。
リスト型をファンクターの固定小数点としてエンコードします。Haskell では、これを次のように表すことができます。
先ほどのμバインダーの範囲が気になります。外側のスコープにバインドされた名前は、内側のスコープで引き続き使用できますか? たとえば、次の式は有効ですか。
...おそらく次と同じです:
...しかし、名前が再利用されると、どのように変化しますか:
上記はすべてレギュラータイプですか?
haskell - 非関数型での「修正」の有用なインスタンス化?
私が使用するたびにfix :: (a -> a) -> a
、それはタイプになっています
いくつかのa
とb
。fix
のような些細なこと以外に、その型パラメーターが関数型にインスタンス化されていない場所の実際のアプリケーションはありますfix (const 0)
か? 署名を最も一般的なままにしておく目的は何ですか?
f# - F# コンパイラがこの関数の末尾呼び出しを作成しないのはなぜですか?
F# の固定小数点コンビネータに問題があります。
(このコードは問題を示すためのものであり、生成された IL コードが読みやすいように特別に記述されています。)
このコードは、最適化とテールコールを有効にしてコンパイルすると、StackOverflowException
. ILコードを調べたところ、次の呼び出し内のラムダに問題を突き止めることができましたfix
。
(読みやすいようにコードを少し変更しました。)
の理由は、StackOverflowException
への呼び出しbody
が末尾呼び出し (callvirt
下部の命令) ではないためです。その理由は、コンパイラが実際にUnit
!を返すラムダへの呼び出しを作成したためです。
したがって、C# の用語で言えば、 Body はFunc<Int32,Unit>
実際にあるべきときAction<Int32>
です。呼び出しは破棄する必要があるものを返すため、末尾呼び出しにすることはできません。また、メソッドはではなくf@1
としてコンパイルされることに注意してください。これが、引数の呼び出しの結果を破棄する必要がある理由です。void
Unit
これは実際に意図されたものですか、それとも何かできることはありますか? コンパイラがこのラムダを処理する方法により、固定小数点コンビネータは、私が意図したすべての目的で役に立たなくなります。
結果として何かを返す限り、それは正常に機能することを付け加えたいだけです。何も返さない関数だけが期待どおりに機能しません。
これは機能します:
これは、ラムダ用に生成されたコードです。
今、テールコールがあります。そして、すべてがうまくいきます。
ILコードfix
(コメントでの議論用):
したがって(fix f)
、 fix の定義の内部は、この時点で発生する再帰呼び出しではなく、fix
それ自体への参照であり、引数とともに、f
呼び出されたクロージャーに格納されProgram/fix@11
、ラムダに渡されるように見えます。fix
このクロージャーを介して実際に呼び出す引数として。
そうしないと、最初から無限再帰にfix
なり、役に立たなくなります。
F# バージョン 3.1.2、F# Interactive バージョン 12.0.30815.0 を使用しています。
お願いします:
代替ソリューションには興味がありません。Unit
ラムダが結果を生成しない場合に、破棄する必要がある a をコンパイラが返す理由を知りたいだけです。
haskell - fix を使用したフィボナッチ数の計算
関数 を使用して、この階乗の例がどのように機能するかを理解しようとしていますfix :: (a -> a) -> a
。
なぜこの型を持っているのかわかりませんfix factabs
...fix
は type の関数を期待していますが、それを typeの関数 (2 つのパラメーターを受け取る関数)a -> a
に適用するにはどうすればよいでしょうか? (a -> a) -> a -> a
私は完全に混乱しています...
limit
基本的に、以下の関数を を使用するものに変換する方法を見つけようとしていfix
ました。助けていただければ幸いです。
haskell - Haskell のトリッキーな階乗
次の関数を使用して、Haskell で階乗を計算する関数を作成する方法はありますか。