問題タブ [discriminated-union]
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.
c++ - パラメータなしのファンクタとその戻り値の判別共用体を C++ で実装する方法は?
私はboost::variant
、この質問をする必要がなく、使用できることを知っています。しかし、使用boost::variant
には多くの醜いコードが含まれます。特に来客はごちゃごちゃ。だから、これ以上苦労せずに...
カリー化された関数の遅延評価を実装するために、次のテンプレート化されたクラスを作成しました。(スニペット全体については、以前の質問を参照してください。)
そのため、メモ化を含めるように更新したいと思います。概念的には、非常に単純です。まず、次のものを交換する必要があります。
と:
しかし、あと2つ残っています。operator _Ret
まず、遅延評価を実行する場合、結果が実際にメモ化されるように更新する必要があります。次に、デストラクタを追加して、 の値に応じてまたはが破棄されるよう_evaluated
にする必要があります。そして、ここで私は物事を行う方法についてよくわかりません。_fun
_res
_fun
まず、これはに置き換える正しい方法_res
ですか? そうでない場合は、どうすればよいですか?
第二に、これは選択的に破壊する正しい方法_fun
ですか_res
? そうでない場合は、どうすればよいですか?
f# - 識別された共用体の特定のメンバーであるリスト要素の数
差別化された共用体があるとしましょう。
次に、リストのメンバーの数を確認したいと思いますBaz
。
これを行うためのより慣用的な方法はありますか?
reflection - 判別共用体のすべての値をマップします
私が差別された組合を持っているとしましょう:
そして、判別共用体を何らかの値にマップする関数:
次のように、組合の各メンバーのコストを含むマップを生成したいと思います。
これは可能ですか?次のようなことができるようになりたいです。
この質問は役に立ちますが、私が必要としているものではありません。プロパティを検査するだけでなく、メモリ内のユニオン メンバーにアクセスできるようにしたいと考えています。
私がこれをやりたい理由は、ゲーム内のすべての異なる種類のカードを表す識別された共用体と、開始時に各カードが何枚あるべきかを示す関数を使用できるようにするためです。その後、イニシャルを簡単に生成できますカードからカウントへのマッピング。これを行うより良い方法はありますか?
types - Clojureで合計タイプ(いずれかのab)を表す慣用的な方法
編集しました。私の質問は、静的型言語の合計型の代わりに、通常どのような慣用的なClojure構造が使用されるかということです。これまでのコンセンサス:動作を統一できる場合はプロトコルを使用し、そうでない場合はタグ付きペア/マップを使用し、必要なアサーションを事前条件と事後条件に配置します。
Clojureは、ベクトル、マップ、レコードなど、製品タイプを表現する多くの方法を提供しますが、タグ付き共用体やバリアントレコードとも呼ばれる合計タイプをどのように表現しますか?Either a b
HaskellやEither[+A, +B]
Scalaのようなもの。
最初に頭に浮かぶのは、特別なタグが付いたマップです{:tag :left :value a}
。しかし、その後、すべてのコードが条件付きで汚染され、(:tag value)
特別なケースがない場合は処理されます...私が確認したいのは次のとおりです。それ:tag
は常に存在し、指定された値の1つのみを取ることができ、対応する値は一貫して同じタイプ/動作でありnil
、存在することはできません。コード内のすべてのケースを処理したことを簡単に確認できます。
の行にマクロがあると考えることができますがdefrecord
、合計タイプの場合は次のようになります。
このようなものはすでに存在しますか?(回答:いいえ)。
properties - F# で判別共用体にセッターを追加する方法
判別共用体にセッター プロパティを追加したいのですが、どのようにすればよいですか?
フェ:
f# - 差別組合の構造的・慣習的平等
私は次の差別された組合を持っています:
に を追加するまで、構造的に同等でしcard -> bool
たSpy
。この質問は、レコードのカスタム等価を行う方法に役立ちます。ただし、この状況でどのように実装するのが最善かはわかりません。で各ケースを列挙する必要はありませんActCard
。
ここでより良いアプローチは何ですか?
generics - F#で一般的な測定単位を使用して結合句を指定するにはどうすればよいですか?
条項が一般的な測定単位を使用するDUを定義する方法はありますか?例えば
このコードはコンパイルされませんが、ジェネリック測定単位で数値を受け取る通常の関数を指定できます。
of
各ユニオン句が最終的には後で指定された型をプライベート型に変換する関数であることを考えると、それが関数定義では機能するが型定義では機能しない特別な理由がありますかMyDU.A
?MyDU.B
ここでやりたいことをする方法はありますか?そうでなければ、なぜそれもうまくいかないのか知りたいです!
ありがとう、
f# - Noneがnullとして表されるのはなぜですか?
CompilationRepresentationFlags.UseNullAsTrueValue
に使用することができます
識別された共用体のnullarydiscriminatorsの表現としてnullの使用を許可する
Option.None
これの最も顕著な例です。
なぜこれが便利なのですか?nullチェックは、ユニオンケース(生成されたTag
プロパティ)をチェックするための従来のメカニズムよりも優れていますか?
それはおそらく予期しない動作につながります:
編集
静的な読み取り専用フィールドの代わりにnullと比較する方が速いというJackの主張をテストしました。
ILSpyを使用すると、t
(予想どおりに)nullにコンパイルされることがわかります。
テスト:
結果:
実数:00:00:00.036、CPU:00:00:00.046、GC gen0:0、gen1:0、gen2:0
CompilationRepresentation
属性が削除されると、静的な読み取り専用フィールドになりt
ます。
そして結果は同じです:
実数:00:00:00.036、CPU:00:00:00.031、GC gen0:0、gen1:0、gen2:0
t == null
パターンマッチは、前者と後者の場合と同様にコンパイルされt is Z
ます。
f# - F# の単一ケース判別共用体での簡潔なパターン マッチ
次の単一ケースの識別共用体があるとします。
ある時点で、実際の文字列が必要になります。それを抽出するために私が見つけた方法は次のとおりです。
これを行うより簡潔な方法はありますか?
私の使用は特別な場合であり、次のような方法があるかどうか疑問に思っているだけで、可能性をカバーしたことを確認するために一致が理にかなっていることを理解しています:
f# - 識別された共用体を折りたたむ方法
識別された共用体にフォールドを実装しようとしています。DUはExprと呼ばれ、プログラム式を表し、多くの場合再帰的です。Exprsに対する操作の結果を再帰的に累積するフォールドを書き込もうとしています。以下は、折り目を書くための私の試みです。
問題は、コードが機能しないことです。これは、最後の行でエラーが発生the construct causes code to be less generic than indicated by the type annotations. The type variable 's has been constrained to be type 'Expr list'
するため、既知です。listFolded
これは、の定義foldProceduralExpr
がほぼ間違いなく間違っているためです。
今、私はコードとその結果としてタイプエラーを修正したいのですが、どうすればいいのかわかりません。私が欠けているのは、非リストまたは再帰的なデータ構造のフォールドがどのように機能するかを理解していることだと思います。私は最近、トライのフォールドをOCamlからF#に変換しましたが、そのフォールドがどのように機能するかを理解するのに多くの問題がありました。
質問1:平手打ちを理解できるこのコードの目に見える修正はありますか?
質問2:これらのタイプの折り目を書く方法を理解するために必要な背景を得るためのリソースはありますか?
さらに詳しい情報が必要な場合はお知らせください。DUは大きすぎて複雑すぎて質問を明確にできないため、ここには含めませんでした。うまくいけば、それはあなたの典型的なLispスタイルのASTデータ構造です。
フォローアップの質問:それが機能したら、その折り目で地図を書きたいと思います。それは典型的な地図のように見えるでしょうか、それともそれを理解するために余分な頭脳の力が必要でしょうか?
編集:トーマスの助けに関して、私は最後の3行を-に変えました
これがまだ理にかなっていることを願っています。
編集:これが私の最終的な解決策です。それは子供を得るよりも一般化されています-
ExprリストとExprリストをフォールド値として使用する理由は、後で使用するために親子関係の構造を保持したいからです。これは、私が思うに、非常にドメイン固有のフォールドです。