問題タブ [computation-expression]
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# - let の仕組み!計算式で
私は現在、素晴らしい fsharpforfunandprofit Web サイトの計算式シリーズに取り組んでおり、計算シリーズのレッスン 4「ラップされた型」に関して質問があります。もう少し読んでみましたが、把握していない重要な概念があります。
実際、私は bind の定義を理解しています:
しかし、この時点で理解できないことの 1 つは、let! を使用した計算式で使用するときの魔法です。
たとえば、次のようになります。
getCustomerId "Alice"はM<'T>を返してくれますが、custId は既にラップされていない 'Tであり、この魔法のトリックがどのように機能するかはどこにもわかりません...
let に隠されたコードの一部ですか! Fsharpコアアセンブリ内の命令?誰かが私にどのようにさせてくれるのか説明してもらえますか! ラッパーから T' を取り出しますか?
ご説明ありがとうございます
f# - 計算式を使用した引用符付き関数の構成
私は周りを見回して、これに対する答えを得るのに苦労しました。明らかな答えがあると確信していますが、それを見つけることができないようです。または、計算式で使用すると通過できない引用符の制限に達しました。
基本的に、計算 F# ワークフローを使用して、以下のように定義された引用符で囲まれたラムダを操作したいと考えています。これらのワークフローを一緒に構成しようとすると、問題が発生します。理想的には、let! を使用して Workflow<'Env, 'Result> インスタンスを一緒に構成したいと考えています。構文。私のやや素朴な試みは以下の通りです:
3 番目の bind メンバーは、「変数 "env" は引用符でバインドされていますが、スライスされた式で使用されています」というコンパイラ エラーを表示します。問題は、どうやってそれを回避するかです。上記は、以下の単純なケースを機能させる試みとして定義しました。
私が達成しようとしていることが可能かどうか、それとも何か間違っているのでしょうか? 最終的な引用された式内のユーザー関数をキャプチャしながら、上記の単純なケースを機能させることは可能ですか?
編集:Tomasの回答を考慮して、WorkflowSourceタイプを使用せずに試しました。まだエラーが発生していません: System.InvalidOperationException: Microsoft.FSharp.Core.ExtraTopLevelOperators.SpliceExpression[T](FSharpExpr`1 expression) では、'%' または '%%' の最初のクラスの使用は許可されていません
f# - match ステートメント内でのカスタム計算式演算子の使用
現在、F# 計算式を試しています。一般的な考え方は、計算式から構築された再帰関数呼び出しの各ステップの後に実行されるアクションを駆動する制御メカニズムを返すことです。全体の例はここで見ることができます。
次の例を使用します。
残念ながら、これはコンパイル時エラーで終了しますunhandled
:カスタム操作は、この計算内で 'use'、'try/with'、'try/finally'、'if/then/else' または 'match' 演算子と組み合わせて使用することはできません式。
match ステートメント内でカスタム演算子を使用することは可能ですか?
f# - F# クエリ式は
私は学んF#
でおり、SQL 型プロバイダーで使用する計算式とクエリ式について読んでいます。私はいくつかの単純なタスクを実行していましたが、ある時点で (Union) 2 つのクエリを連結する必要がありました。最初に考えたのはyield
、シーケンスとリストについて読んだ後、次のようなクエリ式内で同じことを行うことでした。
これは無効なコードでした。私の 2 番目のアプローチは、以下を使用してそれらを「連結」することでした。
または、Linq のConcat
関数を次のように使用します(query {...}).Concat(query {...})
。それを行う方法は、この質問の回答から来ました
上記のアプローチはどちらも 1 つの違いがありますが、使用seq
すると 2 つの SQL クエリが実行され、使用するConcat
と理解できるのは 1 つだけ実行されます。
私の質問はyield
、クエリ式でサポートされていないのはなぜですか?
編集:
さらに調査した後、私はMSDNのドキュメントにたどり着き、 andメソッドが実装されているのを見ましたが、Yield
andYieldFrom
メソッドは実装されていませんでした。これは今ではさらに混乱していますCombine
Delay
f# - F#「早期終了」計算式?
計算式がどのように機能するかについてさらに学習するために、ステートメントのthen
ブロックを評価した後に式の残りをスキップするビルダーをコーディングしようとしています。これにより、ワークフロー自体が. どのステートメントも に評価されない場合、ワークフローは返されます。if
true
false
if
true
例えば:
ここでは、 でresult
ある必要がありtrue
、 でx
ある必要があります33
。
私が得た最も近いものは次のとおりです。
...これにより、ワークフローがfalse
、およびx
に評価されます11
。
これは、私の例の構文を使用して実行できますか?
f# - 計算式はアスペクト指向プログラミングの代替アプローチですか?
計算式はアスペクト指向プログラミングの代替アプローチですか?
これは、分野横断的な問題を管理するための F# のソリューションですか。
以下の記事を見て、AOP (アスペクト指向プログラミング) が頭に浮かびました。
この記事では、著者はロギングを処理する計算式の例を提供しましたが、ビジネス ロジックの主な意図をわかりにくくすることなく、コードの実際のロギングの側面を分離しました。
私の考えは正しいですか?