問題タブ [io-monad]

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 に答える
84 参照

io - Scalaz IO モナドと Stream を組み合わせて takeWhile メソッドを使用した単純なエコー プログラムを作成する

Scalaz IO Monad と Stream を使用して、spoj.com で「生命、宇宙、およびすべて」の問題の解決策を探しています。問題は、小さな数値を入力から出力に書き換え、数値 42 を読み取った後に入力の処理を停止することです。次のクラスを作成しました。

終わりのないループは期待どおりに機能します。

ただし、42番で終了させたい場合は、終了しません。

結局、このコードが 42 を出力することになっていることはわかっていますが (問題ステートメントとは対照的に)、サンプル コードを単純化したかったのです。

どこで間違いを犯していますか?

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

unit-testing - ファイル システムから Tasty `TestTree` を動的に生成する

Parsecライブラリを使用してファイル パーサーを作成しました。Tastyパーサーが特定のファイルを正しく解析することを確認するために、テスト フレームワークを使用して高レベルの単体テストを作成したいと考えています。

次のディレクトリ構造に、適切にフォーマットされた 3 つのファイルがあります。

私はしたいと思います:

  1. すべてのファイルを取得するpath/to/files
  2. 各ファイルの内容を読み取る
  3. testCaseファイルのコンテンツが正常に解析されることを保証する for each ファイルを作成します
  4. これを動的に実行して、後でファイルを追加し、コードを変更しないようにします

私は次のように構築することができました:

この構造は機能しますが、理想的ではありません。これは、 のtestSuite実行時に生成される出力があまり説明的でないためです。

成功時:

失敗時:

この出力は、解析に失敗したすべてのファイルではなく、解析に失敗した最初のファイルのみを出力するため、理想的ではありません。また、エラーがあるかどうかに関係なく、どのファイルが正常に解析されているかもわかりません。

テストツリーを次のようにしたいと思います。

成功時:

失敗時:

TestTreeファイルシステムから動的に整形式を作成しようとする私の試みは次のとおりです。

ご覧のとおり、このコードにはviaunsafePerformIOを抽出する見苦しい呼び出しがあります。ファイル システムから派生した情報 (ファイル名) を構成内で使用する方法を理解できなかったため、この安全でない関数呼び出しを使用せざるを得ないと感じました。結果はモナドに閉じ込められました。TestTreeunsafePerformIO :: IO [TestTree] -> [TestTree]testCase[TestTree] IO

この安全でない関数を使用するのは理想的ではないだけでなく、IOアクションが実際には安全でないため、機能しません。次の例外が発生するため、テスト スイートは実行されません。

の型シグネチャが与えられた場合withResource:

または呼び出しのパラメーターで入力を使用しないIO a -> TestTree 最後のパラメーターの型の関数を構築することは不可能であることがわかりました。フレームワーク作成者の詳細な説明を確認したにもかかわらず、おそらく to の使用方法を理解していない可能性があります。Tasty フレームワーク内に、目的を達成するためのより良い機能があるのではないでしょうか?withResourceIO aTestNametestCasetestGroupTastywithResourcesTestTree

質問:

TestTree必要な記述出力を持つファイル システムから動的に作成するにはどうすればよいですか?

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

haskell - IO モナド haskell の階乗関数

私は IO モナド haskell で階乗関数を実行しています。IO モナドで階乗関数を実行するために、mod3 の例に従いました。私のコードが間違っている理由を理解できません。n>=1 かどうかを確認してから、階乗を n に実行します。最後に (n,r2) に追加して戻ります。誰でもそれを理解するのを助けることができますか?

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

f# - F# で別のプロセス メモリ モナドを読み書きする

シングルプレイヤーゲームのチートに取り組んでいます。私は関数合成、不変性、ボイラープレートのないコードが好きなので、チートを F# で書くことにしました。私はうまくいくものを完成させました。コードが完璧とはほど遠いことは承知していますが、今日、私は F# を使って旅を始めました。

コードから何らかの形で副作用を取り除く方法があるのだろうか。これを達成する方法を教えてください。

ありがとう、

ラファル

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

haskell - ハスケル。なぜ機能しているのですか?(モナドの繰り返し)

走る:

私は出力を得ました:

この関数がすべてのリストの値にどのようにマッピングされているかわかりませんか? 再帰や反復はなく、モナドの内部 m 値を関数 f に渡すだけです。ここで何が欠けていますか?

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

haskell - 状態とランダム性の概念を使用して、このモナド計算を実行します

次の計算について説明します。

barそして、予想通り、半分の時間にbar評価されるように実行する方法を知りたいです。True

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

xml - HXT でツリーを解析しながら、他の XML ファイルを解析する

ゲームのユーザー インターフェイスを記述する XML ファイルを解析し、同時に HXT を学習しようとしています。1 つの XML ファイルを正常に解析できます。getWindowしかし、関数内で他の XML ファイルを開いて解析する最良の方法は何かを理解できませんでした。

各 XML は、いくつかの で構成されますWindow。それぞれWindownameと がありlibraryNameます。後者は、ウィンドウを記述する XML ファイルの名前です。たとえば、ルートは次のようになります。

そして、ウィンドウごとに個別の XML ファイルがあります。例 "window_home":

次のコードでルートを解析DOMDocument.xmlします。

getWindow関数が内部にラップされていないためIO、目的の動作を実現するための最良の方法は何ですか?

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

haskell - Haskell: 予想される型 'IO b' を実際の型 bool と一致させることができませんでした

次のエラーが表示されます。

の定義によりgameFunc:

と関数upCheck:

つまり、基本的にここで起こっているupCheckのは、いくつかの条件が一致しているかどうかを確認する関数であり、関数から呼び出すのと同じ方法で ghci から呼び出すとgameFunc、結果が得られTrueます。ただし、関数から呼び出すと、gameFunc上記のエラーが発生します。何がうまくいかなかったのですか?

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

haskell - Haskell セーフ IO

ファイルが存在する場合はファイルを安全に読み取り、ファイルが存在しない場合は何もしない単純な関数を作成しようとしています。

これはコンパイル時に失敗します

であるため、これは理にかなって:t readFileいますreadFile :: FilePath -> IO String。を返す関数IO Stringなど (とIO String同じではありませんIO ())

署名の変更String -> IO String

handleExists には型があるので、これも理にかなっていますIO ()

全員のルックアップを保存するには、catch を次のようにインポートします。catch import Control.Exception のシグネチャは次のとおりです。 catch :: Exception e => IO a -> (e -> IO a) -> IO a

私の本当の質問は、この種のエラーセーフで柔軟なコードを Haskell で書くにはどうすればよいかということです。より具体的には、成功ケースと失敗ケースの両方を処理できるようにするには、この関数にどのような変更を加える必要があるでしょうか?