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

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

f# - アクティブなパターンに特別な構文が必要なのはなぜですか?

通常の関数をパターンとして使用できれば、次のような簡単なアクティブパターンを作成する必要がなくなります。

そして、仮想的に、許可します

これにより、関数がより再利用可能になり、マッチングで使用する「パターン化」関数が不要になります。

アクティブなパターンは関数として呼び出される可能性があることを知っているので、前の例はパターンのみを定義することで簡略化できます。ただし、特別なパターン構文を使用しないと、これが簡単になります。

特別な構文の理由は何ですか?

編集

以下では、アクティブなパターンがリテラルをシャドウイングします。

パターン内の関数呼び出しでも機能しないのはなぜですか?

編集2

あいまいなシナリオを見つけました

これは、私の考えでは、アクティブなパターンが大文字で始まらなければならない理由を明確にします。これにより、意図が明確になり、前の例のようにシャドウイングが発生する可能性がはるかに低くなります。

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

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型です。

ブライアンが提案したように

編集を終了

注:私がこれを試したコードは次のとおりですが、それが解決するものに対してより良いアルゴリズムを見つけました。

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

f# - アクティブなパターンを持つFizzBu​​zz

私はアクティブパターンを理解しようとしているので、FizzBu​​zzで遊んでいます:

これは基本的に正しいアプローチですか、それともここでアクティブパターンを使用するためのより良い方法がありますか?findMatchintオプションの代わりにintを取得させることはできませんか?

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

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

編集:これはより簡単な再現です:

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

f# - 型テストとリテラルを組み合わせたパターン

この質問のアクティブなパターンは、VS 2012 RTM にアップグレードした後、コンパイルに失敗します。型テストを実行し、単一のパターン内でリテラルを照合する方法を提供します。例えば:

これはアクティブなパターンなしで実行できますか? whenガードを使用できることはわかっていますが ( ) :? string as s when s = ""、他のパターンと組み合わせることはできません。

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

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、ラムダの引数を、それを分解する関数に置き換えるにはどうすればよいですか?

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

f# - 識別共用体型宣言内でのアクティブ パターンの使用

差別化された共用体型宣言内でアクティブ パターンを使用することは可能ですか?

より正確には、次のおもちゃの例を考えてみましょう。

ここで、T で ToString() をオーバーライドしたいとします。T の型宣言内では、T_ToString がその時点でまだ宣言されていないため、T_ToString を参照できません。ToString() の前にアクティブなパターンと T_ToString を移動することはできません。これは、その時点では T がまだ宣言されていないためです。しかし、これもうまくいきません:

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

f# - FSharp アクティブ パターンに関する問題

FSharp でコード クォーテーションを解析し、パターン ヘルパーを構築しています。私が試すまではすべてうまくいっていた

その意図は、''左'' と ''右'' を返す汎用バイナリ関数マッチャーを用意し、Multiple、Divide、Add および Subtract などの特殊なバイナリ マッチャーを作成することです。

ただし、2番目のパターンでエラーが発生します

誰かが私がここで何をすべきか教えてもらえますか?

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

f# - F# 部分アクティブ パターン マッチング "ルールは決して一致しません"

次のアクティブなパターンがあるとします。

そして、次のパターン マッチング関数:

最後の行のワイルドカード パターンは言うwarning FS0026: This rule will never be matched

Some('a)私が見たすべての例は、部分的なアクティブなパターンが一致するために戻る必要があり、返されたパターンNoneがワイルドカードによってキャプチャされることを推測しているようです。エラーは別のことを言っているようです。

私は何が欠けていますか?