問題タブ [mutual-recursion]
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.
f# - 2 つのメソッドを互いに呼び出す方法は?
2 つのメソッドを相互に呼び出す方法 (つまり、A()
callB()
とB()
call を使用A()
) について少し混乱しています。F# は、コード内でメソッドが検出された後にのみメソッドを「参照」しているようです。そのため、そうでない場合は、value または constructor has not been defined と表示されます。
ここで非常に基本的なものが欠けていますか?
f# - F#タイプ参照エラーをどのように解決しますか?
私は自分の本を読み、検索語がなくなるまでグーグルで検索しましたが、それでもこの問題の例や答えを見つけることができません。
次のコードは、エンティティが宣言された時点でタイプEffectとタイプAffectが宣言されていないため、コンパイルされません。だから私が理解していないのは、これを回避する方法です。
C ++では、この問題はhファイルでのプロトタイプ宣言とhファイルのインクルードによって解決されます。C#では、これが問題になることはありません。では、F#でどのように解決されますか?
ここでの基本的な目標は、タイプEntityのオブジェクトが、タイプEntityのオブジェクトに適用できる影響を一覧表示できるようにすることです。エンティティは、適用されたエフェクトを一覧表示することもできます。このように、エンティティの「現在の」状態は、すべてのエフェクトを元のエンティティの状態に対して折りたたむことによって検出されます。
お時間をいただきありがとうございます、
-アダム・レンダ
syntax - F#フォワード型宣言
私はF#でこの問題に遭遇しました。相互に参照する2つのタイプを宣言したいとします。
コンパイラがエラーを生成しないようにするにはどうすればよいですか?
python - この種の相互の「再帰」は何と呼ばれますか?
私の問題は、再帰に非常によく似た特定のスタイルのコードにありますが、それほどではありません。再帰とは、ウィキペディアを引用すると、「定義されている関数が独自の定義内に適用される関数を定義する方法」です。同様に、相互再帰は、定義している関数を直接的または間接的に適用する別の関数を適用します。
問題は、私が考えて扱っているコードが同じ関数を使用していないことです! 別の関数で (メソッドまたはクロージャーとして)同じコードを使用します。
ここでの問題は、私のコードは同じですが、関数は同じではないということです。次の基本的な相互再帰の例を見てください。
これはいくぶん直感的で、非常に明確に相互再帰的です。ただし、呼び出しごとに 1 回作成される内部関数として各関数をラップすると、わかりにくくなります。
暗黙的なメモ化などの最適化を無視すると、厳密には再帰的ではない一連の関数呼び出しが生成され、同じ関数を 2 回呼び出すことなく、さまざまな新しい関数を作成して呼び出すことができます。それにもかかわらず、これらの関数はすべて共通のテンプレートに従っており、何度も何度も作成された同じ関数です (おそらく異なる自由変数を使用して)。
繰り返しますが、クラスを使用した直接同等の実装を考え出すことができます (結局のところ、クラスは実際にはクロージャにすぎません ;)。[insert name here]のこのスタイルは、たとえばComposite Patternで使用されるため、これは特に重要です。違いは、Composite 設計パターンとほとんどの用途 (クロージャーの場合も含む) では、通常、インスタンスがその場で作成されないことです。それは今でも本質的に同じです。
今回はオブジェクト作成とメソッド呼び出しの連鎖ですが、原理は同じです。(実際には、Python がオブジェクトごとに単純なラッパーを定義し、それ自体が毎回まったく同じ関数を呼び出すという点で、少し異なることに注意してください。しかし、これは必ずしも私たちが知る必要があるものではありません。クラスとオブジェクトの他の実装についても真である必要があります.しかし、はい、厳密に言えば、相互に再帰的であるだけでなく...もっと何か、それは私が知りたい他のことです.)
optimization - F#/ Scalaで相互再帰を最適化するための標準的な方法は何ですか?
これらの言語は、相互再帰的な関数の最適化を「ネイティブに」サポートしていないので、トランポリンか、ループとして書き直す必要があると思います)何かが足りませんか?
更新:私はFSharpについて嘘をついたようですが、グーグル中に相互の末尾呼び出しの例を見ませんでした
f# - 循環参照による F# 型の順序付け方法を決定する際の問題
共通の型を拡張するいくつかの型があり、これらは私のモデルです。
次に、CRUD 操作のモデル タイプごとに DAO タイプを用意します。
任意のモデル タイプから ID を検索できる関数が必要になったので、その他の関数用に新しいタイプを作成しました。
問題は、これらのタイプを注文する方法がわからないことです。現在、私は dao の前にモデルを持っていますが、どういうわけかDAOMisc
beforeCityDAO
とCityDAO
beforeが必要ですDAOMisc
が、これは不可能です。
簡単なアプローチは、この関数を各 DAO に配置し、その前に来ることができる型のみを参照することです。したがって、との外部キー関係があるasのState
前に来るので、その他の関数は非常に短くなります。しかし、これは間違っていると思うので、これにどのようにアプローチするのが最善かはわかりません。City
State
City
これが私のその他のタイプBaseType
です。 はすべてのモデルに共通のタイプです。
ここに 1 つの dao タイプがあります。CommonDAO
実際には CRUD 操作のコードがありますが、ここでは重要ではありません。
これは私のモデルタイプです:
このFindIdByType
関数の目的は、外部キー関係の ID を見つけることです。そのため、モデルに値を設定し、CRUD 関数にすべての正しい情報を使用して操作を実行させることができます。したがって、City
州名の ID が必要なので、州名を取得してstate
型に入れ、この関数を呼び出してその州の ID を取得します。したがって、都市の挿入には外部キーの ID も含まれます。
これは、私が解決しようとしている現在の問題である挿入を処理するための非常に一般的な方法で、最良のアプローチのようです。
アップデート:
他のすべての DAO が定義された後、FindIdByType メソッドを何らかの方法で CommonDAO に挿入できるかどうかを調査して確認する必要があります。これが Java の場合、AOP を使用して探している機能を取得しますが、F# でこれを行う方法は不明です。
最終更新:
自分のアプローチについて考えた後、致命的な欠陥があることに気付き、別のアプローチを考え出しました。
これが挿入を行う方法であり、このアイデアを各エンティティ クラスに入れることにしました。これはおそらくより良いアイデアです。
fklist
私はまだ使い始めていませんint list
が、それぞれの列名がどの列名に対応するかを知っているのでinner join
、たとえば選択に対して行う必要があります。
これは、一般化された基本タイプの挿入です。
F# で共分散/反分散を実行できるとよいので、その制限を回避する必要がありました。
f# - 識別された共用体は相互に参照できますか?
識別された共用体を使用して式ツリーを構築しています。以下のコード:
BoolExpressionが定義されていないため、エラーがスローされます。定義を入れ替えると、予想どおりに逆になります(IntExpressionは定義されていません)。
これを回避する方法はありますか?
c++ - 相互再帰クラス
C ++で相互再帰クラスを実装するにはどうすればよいですか?何かのようなもの:
haskell - Haskell の相互再帰評価器
更新:最終的な解決策を説明する回答を追加しました(ヒント: 単一のExpr
データ型では不十分でした)。
私は小さな式言語のエバリュエーターを書いLetRec
ていますが、構造に行き詰まっています。
これは言語です:
そして、これはこれまでの評価者です:
これは、評価したいテスト関数です。
編集:
Travis の回答と Luke のコメントに基づいて、エラー モナドに MonadFix インスタンスを使用するようにコードを更新しました。前の例は問題なく動作します。ただし、次の例は正しく機能しません。
これを評価するとき、エバリュエーターはループし、何も起こりません。ここで少し厳しすぎるものを作ったと思いますが、それが何であるかはわかりません。MonadFix 法の 1 つに違反していますか?
f# - F#: 相互再帰関数
重複の可能性:
[F#] 2 つのメソッドを相互に呼び出す方法は?
皆さんこんにちは、
相互に再帰的であることでメリットが得られる 2 つの関数があるシナリオがありますが、F# でこれを行う方法がよくわかりません。
私のシナリオは次のコードほど単純ではありませんが、コンパイルに似たものを取得したいと考えています。