私はF#を初めて使用し、パターンマッチングのアイデア全体に精通していません。問題のより良い解決策を探しましたが、問題を適切に表現することすらできないのではないかと心配しています。質問のタイトルが少なくともある程度正確であることを願っています。
私がやりたいのは、から2つの「パラメータ」を抽出することですlistMethod。
listMethod文字列と「パラメータ」を持ついくつかのタイプの1つですExpression(パラメータは間違った用語だと思います):
let (varDecl, listExpr) =
match listMethod with
| Select (var, expr) -> (var, expr)
| Where (var, expr) -> (var, expr)
| Sum (var, expr) -> (var, expr)
| Concat (var, expr) -> (var, expr)
次に、作業を続けvarDecl、最後に、に基づいて作成したいくつかの一時変数を使用する実際のlistMethodコードと同様の一致式を作成しvarDeclます。
私の質問は次のとおりです。上記のコードをよりコンパクトにするにはどうすればよいですか?
string2つのパラメーター(typeとExpression)を持つすべてのタイプを自分でリストせずに一致させたいのですが、これはちょっと醜くて保守が困難です。
タイプは次のListMethodように宣言されます(すべてがFsLex / FsYaccプロジェクトです)。
type ListMethod =
| Select of string * Expr
| Where of string * Expr
| Sum of string * Expr
| Concat of string * Expr
| ...
| somethingElse of Expr
(現在、私はフォームのタイプしか持っていませんstring * Exprが、それは変更されます)。
これは、経験のある人にとってはかなり馬鹿げた質問だと思いますが、私が言ったように、私はF#を初めて使用し、自分で解決策を見つけることができませんでした。
前もって感謝します!
編集: 私は本当にすべての可能なタイプをlistMethod2回リストすることを避けたいです。式でワイルドカードまたはプレースホルダーを使用する方法がない場合matchは、タイプを変更して、listMethodよりクリーンにすることができます。
頭に浮かぶオプションの1つは、1つのタイプのみlistMethodを作成し、具象タイプの3番目のパラメーター(Select、Where、Sum)を作成することです。それとももっと良いアプローチがありますか?