問題タブ [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.

0 投票する
4 に答える
2991 参照

f# - F#ユニオンメンバーに相当するEnum.GetNameは何ですか?

Enum.GetNameF#の識別された共用体メンバーと同等のものを取得したいと思います。呼び出すToString()とTypeName+MemberNameが表示されますが、これは私が望んでいるものではありません。もちろん、部分文字列にすることもできますが、安全ですか?それとももっと良い方法がありますか?

0 投票する
3 に答える
1434 参照

f# - 差別された組合と束縛をさせますか?

差別共用体で let バインディングが許可されないのはなぜですか? デフォルトのコンストラクターで実行されている let バインディングと関係があると思いますか?

二次的な注意として、私がどのように書き直すAI_Chooseことができるかについての提案をいただければ幸いです。AI とのタプルで重み付けされた優先度を維持したい。私の考えは、ChooseをAI_Weighted_Priority継承してオーバーライドすることです。AI_Priority長さの異なるzipリストを扱いたくありません(悪い習慣です。)

0 投票する
2 に答える
233 参照

f# - F# での式の最適な表現

私は、LINQ 式 (基本的には LINQ-to-SQL の変更されたサブセット) から SQL を生成するライブラリに取り組んでいます。私は判別共用体を使用して SQL 式をモデル化していますが、いくつかの (認識されている?) 制限に遭遇しました。次のようなことをしたい(最後の行に注意してください):

私は次のことができます:

...最後の 2 行を次のように変更します。

しかし、これには次の 2 つの問題があるようです。

  1. SqlOrderByExpression は SqlExpression ではありません。これにより、ビジター パターンの使用が難しくなります (ここに問題があるのではないでしょうか?)。つまり、Select 式をトラバースするときに、各式を Visit(expr:SqlExpression) に渡す order by 式のリストを反復処理することはできません。

  2. SqlOrderByExpression は単なるタプルの型エイリアスであるため、型情報は保持されません。それは読みやすさIMOを傷つけます。

これをモデル化するより良い方法はありますか?継承ルートを試してみましたが、DU の方が作業がはるかに簡単だと思います (前述の難しさを除けば)。

0 投票する
4 に答える
711 参照

arrays - F# で異なる型の配列の識別結合から型付き配列を取得する

異なるタイプの配列の識別結合がある場合、それらを「実際の」タイプに変換するにはどうすればよいですか?

foo の値を取得したときに上記を実行すると、次のように表示されます。

foo から int の実際の配列を取得するにはどうすればよいですか? のようなものにアクセスできる構文が欠けているだけ foo.[2]ですか? foo で列挙できないため、マップを使用できませんでした。返される配列の異なる型ごとに適切に型指定された配列を返す ItemStuff のメンバーを作成できますが、それは正しくないように思えましたか?

ここで私の最善のアプローチは何ですか?

これが私がやったことです。それを行うためのより良い方法についてのアイデアはありますか?

0 投票する
2 に答える
457 参照

f# - FParsecのアップグレード:識別された共用体をアップグレードして、新しい等式/比較の制約を満たします

そこで、陽気な一連のイベントで、 FParsecソースをダウンロードしてビルドしようとしました。残念ながら、新しい1.9.9.9とは互換性がありません。簡単な問題を修正しましたが、まだ機能しない識別された共用体がいくつかあります。

具体的には、Don Symeの投稿では、オブジェクトは比較をサポートせず、関数も同等性をサポートしていないため、型のアイテムを含む、objまたは自動的に同等性または比較制約を取得しない識別された共用体について説明しています。->(自動生成された等式/比較が以前はバグがあったかどうかは明らかではありませんが、コードは生成されなくなったため、コンパイルすらされません。)

問題のあるDUの例を次に示します。

問題のある使用法は次のとおりです。

または、比較制約の場合

私が知る限り、各インスタンスに一意のintをタグ付けするドンのソリューションは、カスタムの等式/比較制約(または、DUの個々のブランチを順序付けることができるように一意のintタプル)を実装する正しい方法です。しかし、これはDUのユーザーにとっては不便です。現在、DUの構築には、次のスタンプを取得するための関数を呼び出す必要があります。

タグ取得を非表示にして、ライブラリのユーザーに同じコンストラクターを提示する方法はありますか?つまり、インターフェイスを変更せずに実装を変更するには?これは(コードについて私が理解していることから)PrecedenceParserOpパブリックタイプであるように見えるため、特に重要です。

0 投票する
1 に答える
983 参照

.net - F# での Haskell の「派生ショー」?

deriving ShowHaskell では、型定義に追加するだけで、代数型/判別共用体を文字列として「表示可能」にするのは簡単です。

F# では、次のようなものを書くことになります。

そして明らかに、より複雑な型ではさらに悪化します。

deriving ShowF#のようなものを取得する方法はありますか?

0 投票する
6 に答える
3627 参照

c# - F# 判別共用体型を C# で複製するにはどうすればよいですか?

渡されたメッセージを処理する Actor という新しいクラスを作成しました。私が直面している問題は、関連しているが異なるメッセージをアクターに渡す最もエレガントな方法を見つけ出すことです。私の最初のアイデアは継承を使用することですが、非常に肥大化しているように見えますが、明確な要件である強力な型です。

アイデアはありますか?

アクタークラス

0 投票する
2 に答える
383 参照

f# - 識別共用体での記号/句読点の使用方法

自然言語パーサーによって返される品詞タグやその他のラベルの識別結合を作成しようとしています。

C#/Java では文字列または列挙型のいずれかを使用するのが一般的ですが、F# ではこれらが個別の読み取り専用値であるため、判別共用体の方が適しているようです。

言語リファレンスで、この記号 ``...`` を使用してキーワード/予約語を区切ることができることがわかりました。これは

type ArgumentType =
| A0 // subject
| A1 // indirect object
| A2 // direct object
| A3 //
| A4 //
| A5 //
| AA //
| ``AM-ADV``

ただし、タグには $ などの記号が含まれています。

type PosTag =
| CC // Coordinating conjunction
| CD // Cardinal Number
| DT // Determiner
| EX // Existential there
| FW // Foreign Word
| IN // Preposision or subordinating conjunction
| JJ // Adjective
| JJR // Adjective, comparative
| JJS // Adjective, superlative
| LS // List Item Marker
| MD // Modal
| NN // Noun, singular or mass
| NNP // Proper Noun, singular
| NNPS // Proper Noun, plural
| NNS // Noun, plural
| PDT // Predeterminer
| POS // Possessive Ending
| PRP // Personal Pronoun
| PRP$ //$ Possessive Pronoun
| RB // Adverb
| RBR // Adverb, comparative
| RBS // Adverb, superlative
| RP // Particle
| SYM // Symbol
| TO // to
| UH // Interjection
| VB // Verb, base form
| VBD // Verb, past tense
| VBG // Verb, gerund or persent participle
| VBN // Verb, past participle
| VBP // Verb, non-3rd person singular present
| VBZ // Verb, 3rd person singular present
| WDT // Wh-determiner
| WP // Wh-pronoun
| WP$ //$ Possessive wh-pronoun
| WRB // Wh-adverb
| ``#``
| ``$``
| ``''``
| ``(``
| ``)``
| ``,``
| ``.``
| ``:``
| `` //not sure how to escape/delimit this

``...`` WP$ や ( のような記号では機能しません。

また、パーサーが `` を意味のある記号として返すという興味深い問題があるため、これもエスケープする必要があります。

これを行う他の方法はありますか、それとも差別された組合ではこれは不可能ですか?

現在、次のようなエラーが発生しています

  • 名前空間、モジュール、型、または共用体のケース名が無効です
  • 識別された共用体ケースと例外ラベルは大文字の識別子でなければなりません

これらのばかげたケースで toString をオーバーライドして、記号を英数字の同等のものに置き換えることができると思いますか?

0 投票する
15 に答える
56952 参照

c# - C# の判別共用体

[注: この質問の元のタイトルは「C# の C (ish) スタイル ユニオン」でしたが、Jeff のコメントからわかるように、この構造は「差別化されたユニオン」と呼ばれているようです]

この質問の冗長さを許してください。

すでに SO に似たような質問がいくつかありますが、それらはユニオンのメモリ節約の利点または相互運用のためにそれを使用することに集中しているようです。 そのような質問の例を次に示します。

ユニオンタイプのものを持ちたいという私の願望は、多少異なります。

現在、このようなオブジェクトを生成するコードを書いています。

かなり複雑なことですが、同意していただけると思います。問題は、それはいくつかの特定の型 (例えば, and (クラス) としValueAましょう) だけであり、別の小さな型のセットになる可能性があるということです。私はこれらの値をオブジェクトとして扱うのは好きではありません (私は、型安全性を考慮したコーディング)。 stringintFooValueB

そこで、ValueA が論理的に特定の型への参照であるという事実を表現するために、単純な小さなラッパー クラスを作成することを考えました。Union私が達成しようとしていることが C のユニオンの概念を思い出させたので、クラスを呼び出しました。

このクラスを使用すると ValueWrapper は次のようになります

これは私が達成したかったことのようなものですが、かなり重要な要素が 1 つ欠けています。それは、次のコードが示すように、Is および As 関数を呼び出すときにコンパイラが強制する型チェックです。

IMO ValueA が a であるかどうかを尋ねるのは有効ではありません。charその定義が明確にそうではないことを示しているためです。これはプログラミング エラーであり、コンパイラにこれを取り上げてもらいたいと思います。[また、これを正しく理解できれば、(願わくば) インテリセンスも取得できます。これは恩恵です。]

Tこれを実現するために、型が A、B、または C のいずれかであることをコンパイラに伝えたいと思います。

私が達成したいことが可能かどうか、誰にも分かりますか? それとも、そもそもこのクラスを書いた私は単純に愚かでしょうか?

前もって感謝します。

0 投票する
4 に答える
1195 参照

f# - F#の識別された共用体での共有ケース

私はこのようなものを書きたいです:

NumExpコンパイラは、とExpの間の競合について文句を言いgetValueます。次の場合でも失敗します。

関数で動作する両方の識別された共用体で同じケースを使用する方法はありますか?DU定義自体はOKです。

同じケースを使用して、次のような間接参照のレベルを追加しないようにします

Exp定義で。ここでは非常に基本的なものが欠けているように感じます。

私が持っている理由は、式の生成を容易にするため、2を(2つのフロートではなく)NumExpに「プラグイン」できるようにしたいからです。ExpDotExp

編集:私が本当に知りたかったのは、2つのDUの2つのケースを同じエンティティ(Exp「含む」のようなものNumExp)として扱うことができるかどうかです。私は今気づきExp.NumNumExp.Num完全に別の存在です。Tomasは、以下の2つのケースを区別するための優れた方法を提供します。