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

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

.net - F# での非同期計算の作成

非同期 HTTP API クライアント モジュール/ライブラリを作成しています。すべてを可能な限り DRY にするために、API 呼び出しを行う個別の部分からすべての HTTP API 呼び出しを構成しようとしています。ボトムアップ: 要求の構築、応答の取得、応答の文字列バッファーへの読み取り、JSON コンテンツの解析その文字列バッファをオブジェクトに。

これまでのところ、私はこのコードを持っています:

そして、ご覧のとおり、私は独自の追加で Async モジュールを拡張しました。

私が達成しようとしている目標はasync、計算式の構文を最大限に活用するために、ブロックで使用できる関数を含むモジュールを構築することです。私はそれを正しく行っているかどうか、正しい名前を選択しているかどうかなどを疑問に思っていました.正式な関数型プログラミングの教育はほとんどまたはまったく受けていません。

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

f# - モナドの型を特殊化するとエラーになるのはなぜですか?

次の計算シーケンスはエラーなしで機能します。

同じモナドを整数型に特殊化するとします。

誰かがここで私の理解の失敗を説明してもらえますか? 完全な説明を書き出すのに時間がかかりすぎる場合に備えて、ヒントも役に立ちます。

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

f# - f# コード生成用の計算式

f# 計算式を使用して構成的再帰降下パーサーを実行する方法についていくつかの例が見つかりましたが、私はそれらを逆に使用しようとしました。一部の XML データから (c++) ソース ファイルを生成するための読みやすいコードを作成する。それでも、私は立ち往生しており、コミュニティが私の誤解を見つけるのを手伝ってくれれば幸いです. 公共の利益のために、私の希望は、この投稿がすぐに f# 計算式、モナディック スタイルを使用してクールな方法でコード ジェネレーターを実行する方法を紹介することです。

これまでに私が得た距離は次のとおりです(簡略化して、この質問の目的で世代の入力データを省略しています):

明らかに、上記のコードはせいぜい私が達成しようとしていることを示しているだけです。私の調査では、計算式の使用方法に関する良い例は得られませんでした。私が見つけた多くの例は、ビルダーがどのように宣言されているかを示すか、少し後で停止しますが、最終的な式を実際に記述する方法を示していません。

したがって、誰かが上記の意味不明なコードがやろうとしていることを実行する実際のサンプルを投稿する時間を見つけた場合、それは最も有益であり、この (少なくとも私にとっては) 紛らわしい側面に関してインターネットで見つけることができるもののギャップを埋めるでしょう. f# プログラミングの。

上記のコード サンプルでは、​​そもそもビルダー モナドから取得したものを確認できません。フォーマッタ コードは、非モナディック実装に比べてきれいに見えません。

誰かが回答の投稿でパラメーターに署名と型を追加してくれれば、それは素晴らしいことです。少なくとも私にとっては、「let-the-compiler-find-the-types」スタイルに比べてはるかに理解しやすいです。

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

f# - 引用された計算式での F# の遅延

計算式で Quote メンバーを使用してワークフローを AST に変換しますが、引用が構築されるときに が実際にはシーケンスで呼び出されないようにしたいと考えていますGetEnumerator()(つまり、なんらかの形式の遅延があります)。私の使用例では、シーケンスはリモート データ ソースを表し、そのメンバーを呼び出すと、GetEnumerator()実際に外部に出てクエリを実行します。

  1. Source メンバーで暗黙的に Lazy 型を使用する (それでも Quote メンバーを使用する) 方法はありGetEnumerator()ますか?

  2. let バインディングがモジュールのプロパティとして定義され、別の関数内の変数が引用符で異なるエンティティとして扱われるのはなぜですか、つまりPropertyGetvs Value.

いくつかのテストコード...

その結果、次の 2 つの引用が得られます

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

f# - 前方パイプ式を計算式に変換するにはどうすればよいですか?

だから、私はこれを変えることができるカスタム計算式を構築したいと思います -

このようなものに -

これは可能ですか、それとも可能に近いですか?もしそうなら、どのようなアプローチを取ることができますか?これはモナドですか、それともそれ以下ですか?

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

haskell - F# で (モナド) 計算の結果を正しく破棄する方法

Haskell では、次のように記述できます。

F# では、ここまで来ました。

つまり、この未使用のバインドを導入してlet! _ =、不要な「スペース」パーサー (モナド) の解析値を破棄する必要があります。

F# でこれらの役に立たないバインディングを回避するにはどうすればよいですか? do! を使用してみましたが、エラーが発生しました (私の>>=関数は型単位ではなく 'a を取るため):

これが私のビルダー定義です:

>>関数を定義する必要がありますか? ビルダーに Combine() を追加しますか? これを正しく行う方法はありますか?コード例?

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

f# - F# 計算式 - 型の問題

私はいくつかの哀れなコード行と戦っていますが、問題に頭を悩ませることはできません-何らかの理由で、F# の型システムのこの側面の原則を理解することができず、これまでのところすべての読み取りが機能していません.

私がここで犯している愚かな学生の間違いを誰か指摘してもらえますか? 私はそれを作っていることを知っていますが、私はそれを見ることができません! 私はこれで痛みを伴う初心者の土地から抜け出そうとしているので、なぜこれがうまくいかないのかという完全な原則を理解することが私の目標です - どんな助けも感謝して受け取ります!

これは単純な演習です。実行するためにモナドを実際に必要としない単なる練習ですが、次のプロジェクトでこれらのことを自分のベルトの下に置きたいと思っています。

私は以下を取得しています:

更新:以下のヘルプに基づいて、現在これが機能しています:

作業はおそらくまだ概念的にはまだ行われていませんが、印刷する値を取得することはできません。私はハッキングを続けます - 私はたくさんの読書をしました。それが私がエクササイズを得たところですが、コンセプトを得る唯一の方法はそれと戦い続けることだと思います.

私は自分のブログ ( http://richardgriffiths.azurewebsites.net/?p=2332 ) でより単純な形式で成功した ので、型システムで得た構文/概念の障壁を打ち破る必要があるだけです。

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

f# - 計算式での TryWith のラングリング

(FParsec の 'grok' に失敗したので、どこかで読んだアドバイスに従い、自分で小さなパーサーを書き始めました。どういうわけか、それをモナド化するチャンスと思われるものを見つけましたが、今は N 個の問題があります...)

これは私の「結果」タイプです(簡略化)

これが計算式ビルダーです

この最初の例では、すべてが期待どおりに動作 (コンパイル) します。

私の問題はここにあります。「結合」関数で失敗をキャッチして失敗を返すことができるようにしたいのですが、「ゼロ」を定義する必要があると言われています。

Zero で何を返す必要があるのか​​ わからないので、 を投げただけでmember m.Zero() = Failure("hello world")、 が必要だと表示されますTryWith

そう:

そして今、遅延が必要なので、member m.Delay f = (fun () -> f()).

その時点で、(上にex -> FailureThis expression should have type 'unit', but has type 'Result<'a>'、、、と私は腕を上げて皆さんの方を向いています...

再生用リンク: http://dotnetfiddle.net/Ho1sGS