問題タブ [active-pattern]
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
あいまいなシナリオを見つけました
これは、私の考えでは、アクティブなパターンが大文字で始まらなければならない理由を明確にします。これにより、意図が明確になり、前の例のようにシャドウイングが発生する可能性がはるかに低くなります。
f# - F#アクティブパターンの結果を再利用する
次のコードでは、反復ごとにアクティブパターンの結果を3回再利用する必要があります。すなわち
アクティブパターンの結果を保存できることがわかりました。すなわち
私が理解できなかったのは、アクティブパターンの結果を一致ステートメントで使用できるかどうかでした。すなわち
問題は、保存されたアクティブパターンの結果をmatchステートメントで使用できるかどうかです。
もしそうなら、どのように?そうでない場合は、論理的に意味があるように説明する必要があります。
おそらくなぜそうではないかの例。つまり、言語仕様、シンタックスシュガーは、アクティブなパターンの結果をバインドすることを許可するべきではありませんでした。ExprItemsとPatItems
F#2.0言語仕様(2010年4月)を調べました http://research.microsoft.com/en-us/um/cambridge/projects/fsharp/manual/spec.html#_Toc270597500
しかし、私は答えを確認するものを何も認識しませんでした。
編集
コードをに変更した場合
Choice1Of7の後に(tree.Parent、position)に対して次のエラーが発生します。
この式はユニット型であることが期待されていましたが、ここでは'a*'b型です。
ブライアンが提案したように
編集を終了
注:私がこれを試したコードは次のとおりですが、それが解決するものに対してより良いアルゴリズムを見つけました。
f# - アクティブなパターンを持つFizzBuzz
私はアクティブパターンを理解しようとしているので、FizzBuzzで遊んでいます:
これは基本的に正しいアプローチですか、それともここでアクティブパターンを使用するためのより良い方法がありますか?findMatch
intオプションの代わりにintを取得させることはできませんか?
f# - F#3.0で壊れたアクティブパターン
このアクティブなパターンはF#2.0でコンパイルされます。
ただし、F#3.0では、次のエラーが発生します。
アクティブパターン'|値|_|' 入力によって決定されない型変数を含む結果型があります。一般的な原因は、結果のケースが言及されていない場合の[原文のまま]です。たとえば、'let(| A | B |)(x:int)=Ax'です。これは、型制約で修正できます。たとえば、'let(| A | B |)(x:int):Choice = A x'
私は試した:
と:
どうすれば修正できますか?
環境:Visual Studio 2012(RTM)およびFSI v11.0.50727.1
編集:これはより簡単な再現です:
f# - 型テストとリテラルを組み合わせたパターン
この質問のアクティブなパターンは、VS 2012 RTM にアップグレードした後、コンパイルに失敗します。型テストを実行し、単一のパターン内でリテラルを照合する方法を提供します。例えば:
これはアクティブなパターンなしで実行できますか? when
ガードを使用できることはわかっていますが ( ) :? string as s when s = ""
、他のパターンと組み合わせることはできません。
f# - F#アクティブパターンを理解しようとすると、なぜこれを行うことができますか?
Dictionary
私は最初にこうして繰り返したオーバーを持っています:
myDictionary |> Seq.iter (fun kvp -> doSomething kvp.Key kvp.Value)
後で、KeyValue
アクティブなパターンを利用できることを発見し、これを実行します。
myDictionary |> Seq.iter (fun (KeyValue (k, v)) -> doSomething k v)
アクティブなパターンが何らかの形式のプリプロセッサディレクティブではないことを知っているのでkvp
、ラムダの引数を、それを分解する関数に置き換えるにはどうすればよいですか?
f# - 識別共用体型宣言内でのアクティブ パターンの使用
差別化された共用体型宣言内でアクティブ パターンを使用することは可能ですか?
より正確には、次のおもちゃの例を考えてみましょう。
ここで、T で ToString() をオーバーライドしたいとします。T の型宣言内では、T_ToString がその時点でまだ宣言されていないため、T_ToString を参照できません。ToString() の前にアクティブなパターンと T_ToString を移動することはできません。これは、その時点では T がまだ宣言されていないためです。しかし、これもうまくいきません:
f# - FSharp アクティブ パターンに関する問題
FSharp でコード クォーテーションを解析し、パターン ヘルパーを構築しています。私が試すまではすべてうまくいっていた
その意図は、''左'' と ''右'' を返す汎用バイナリ関数マッチャーを用意し、Multiple、Divide、Add および Subtract などの特殊なバイナリ マッチャーを作成することです。
ただし、2番目のパターンでエラーが発生します
誰かが私がここで何をすべきか教えてもらえますか?
f# - F# 部分アクティブ パターン マッチング "ルールは決して一致しません"
次のアクティブなパターンがあるとします。
そして、次のパターン マッチング関数:
最後の行のワイルドカード パターンは言うwarning FS0026: This rule will never be matched
Some('a)
私が見たすべての例は、部分的なアクティブなパターンが一致するために戻る必要があり、返されたパターンNone
がワイルドカードによってキャプチャされることを推測しているようです。エラーは別のことを言っているようです。
私は何が欠けていますか?