問題タブ [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# - この F# 計算式で警告が表示されるのはなぜですか?
このコード:
印刷成功 "はい!"
ただし、動作しないことを意味する警告が表示されます。
File1.fs(19,3): 警告 FS0708: この制御構造は、計算式ビルダーが 'ReturnFrom' メソッドを定義している場合にのみ使用できます
奇妙な警告のように思えます: もしそれが正しければ、コードは動作しないはずです。ビルダーが ReturnFrom を合成しなければならなかったと言っているだけですか?
(F# バージョン 1.9.7.4、.NET Framework バージョン v4.0.21006 用にコンパイル)
f# - F# のカスタム計算式
私は F# のモナド (別名計算式) をいじっていましたが、次の単純な Identity モナドを書きました。
マークされた行に表示されるエラーがわかりません:
この式は Identity<'a> 型を持つことが期待されていましたが、ここでは 'b * 'c 型になっています
getInt() は明らかに type の値であるため、これは意味がないと思いますIdentity<'a>
。
誰が私が間違っているのか教えてもらえますか?
f# - シングルステップのようなものを可能にするF#ワークフローをどのように作成しますか?
各ステップの後に継続のようなものを返す式を作成するビルダーを作成したいと思います。
このようなもの:
'let a'行は、後で評価される残りの式を含むものを返します。
ステップ数ごとに別々のタイプでこれを行うのは簡単ですが、もちろん特に便利ではありません。
そして、結果は私が探しているものです:
しかし、私はこれの一般的なケースがどうなるかを理解することはできません。
私が欲しいのは、このワークフローにイベントをフィードできるようにすることです。そうすれば、次のように書くことができます。
そして、イベントがワークフローの次のステップへの移動をトリガーするようにします。(特に、私はこの種のことをMonoTouchで遊んでみたいと思っています-iPhoneのF#。objcセレクターを回すと私は狂気になります。)
c# - IEnumerable 以外の型 (モナド?) を操作する LINQ クエリ式-- 用途は?
私はTomas Petricek と Jon Skeet によるReal-world Functional Programmingという本を読んでいますが、計算式1) (別名モナド) のセクションを理解するのに苦労しています。
この本を通じて、以前の経験とは対照的に、LINQ クエリ式は に限定されずIEnumerable<T>
、他のカスタム型でも機能することを学びました。これは私にとって非常に興味深いことであり、クエリ式の構文 ( from x in ... select ...
) が適しているシナリオがあるかどうか疑問に思っています。
背景情報:
どうやら、そのようなカスタム型は計算型と呼ばれ、Haskellのモナドと本質的に同じものとして描かれています。私はモナドが何であるかを正確に把握することはできませんでしたが、本によると、それらはbindとreturnと呼ばれる 2 つの操作によって定義されます。
関数型プログラミングでは、これら 2 つの操作の型シグネチャは次のようになります (私が思うに):
はM
モナド型の名前です。
C# では、これは次のようになります。
LINQ Enumerable.Select
(射影演算子) は、バインド操作とまったく同じシグネチャを持っていることがわかりM := IEnumerable
ます。
私のカスタム LINQ 計算タイプ:
この知識を使用して、次のようなカスタム計算タイプを記述できるようになりました IEnumerable
。
Wrapped<T>
これで、LINQ クエリ式で使用できるようになりました。たとえば、次のようになります。
もちろん、この例はあまり役に立ちませんが、クエリ式を作成して、コレクションを操作する以外のことを行う方法を示しています。たとえば、値を何らかの型でラップおよびラップ解除するなどです。
質問:
上記の計算タイプはあまり役に立たないようです。したがって、LINQ クエリ式を利用する (コレクションの処理以外に) 他にどのような合理的な用途があるのでしょうか?
1)セクション 12.4:「代替ワークフローの紹介」、334 ページから。
f# - 計算式の再帰関数
最初にいくつかの背景。私は現在、モナディックパーサーコンビネーターについていくつかのことを学んでいます。この論文(p。16-17)から「chainl1」関数を転送しようとしたときに、次の解決策を思いつきました。
大きな入力で関数をテストしたところ、StackOverflowExceptionが発生しました。今、私は疑問に思っていますが、末尾再帰を使用するような方法で、何らかの計算式を使用する再帰関数を書き直すことは可能ですか?
計算式を展開すると、一般的にどのようにできるのかわかりません。
f# - 再帰的な計算式
前の質問で、末尾再帰を使用するように計算式を書き直す方法を説明しました。コードを書き直しましたが、StackOverflowExceptionが発生しました。問題を特定するために、状態モナド(このブログエントリから取得)を使用していくつかの小さなコードを記述しました。
Loop関数は末尾再帰(?)を使用できますが、これによりStackOverflowExceptionが再びスローされます。StateBuilderクラスに何か問題があると思います。私はDelayメソッドで何かをしようとしました。すべてを余分なラムダでラップしますが、成功しません。私は現時点で完全に立ち往生しています。ここで私の2番目の試み(コンパイルされません):
c# - `where T:U`ジェネリック型パラメーター制約をC#からF#に変換するにはどうすればよいですか?
F#は、型推論規則に問題を抱えています。単純な計算ビルダーを作成していますが、ジェネリック型変数の制約を正しく取得できません。
私が欲しいコードはC#で次のようになります:
これまでにF#バージョンで思いついた最高の(ただしコンパイルされていないコード)は次のとおりです。
残念ながら、メソッドのwhere TA : TZ
型制約をどのように変換するかはわかりません。Bind
私はそれがのようなものであるべきだと思った′a when ′a :> ′z
が、F#コンパイラはこれをどこにも好まないので、私はいつもいくつかのジェネリック型変数が別のものに制約されてしまう。
誰かが正しいF#コードを見せてくれませんか?
背景:私の目標は、次のようなF#カスタムワークフローを作成できるようにすることです。
f# - 計算ワークフローの問題
エキスパートf#ブックの例に従おうとしていて、ワークフローに問題があります...コードは次のとおりです。
問題は、すべての値がtrueの場合、期待どおりにSome(true、true、true)を取得しますが、渡された値の1つがfalseの場合、fooはnull(!)です。誰かftw?
ありがとう!
f# - 行方不明のlet!、do!、return and return!をキャッチするのに最適です。F#の計算式で
私は計算式が大好きですが、returnキーワードや!を忘れるなどの単純な間違いを犯します。let!のような表現で そして戻る!、または私は単にdo!を書くのを忘れます。これは、状態を忘れがちで、定義したモナド演算子に焦点を合わせる傾向がある状態モナドでよく発生します。
モナド演算子が「匿名」関数ではなく「モナド型」の型を返すようにすることがあります。これは私の忘れたタイピングを追跡するのに役立ちますが、実際には理想的ではありません。誰かもっと良いトリックがありますか?