問題タブ [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.
haskell - haskell プログラムへの柔軟な数の引数
System.FilePath.Find
filemanipのモジュールを使用して、処理する必要があるすべてのファイルを再帰的に検索しています (ここでは、混乱を避けるために、実行するアクションとしてコンソールへの出力のみを使用します)。さて、このコード:
この呼び出しでうまく機能します
./myprog tet .
この場合、get
引数は無視され (後で出力データベース ファイルになります)、2 番目の引数は一致するファイルを再帰的に検索します。また、ファイルを 1 つだけ指定することもできます。これは完璧です!
しかし、私は指定できるようにしたいと思います
./myprog tet パス 1 パス 2 パス 4 ファイル 1
しかし、これはもちろんパターンマッチングで失敗します:
./myprog tet . .
myprogt: ユーザー エラー (myprog.hs:11:9-22 の do 式でパターン マッチ エラー)
では、このプログラムをより柔軟にして、2 つ以上の引数を取ることができるようにするにはどうすればよいでしょうか?
実際、こんな質問をして申し訳ありませんが、私の Haskell の知識は限られていますが、最初のプロジェクトでやらなければならない新しいことごとに増えています。
haskell - Haskellプログラムで返されたEitherTを使用する
私が取り組んでいる Haskell プロジェクトで「citation-resolve」パッケージを使用しようとしていますが、実際のコードで EachT を使用するのに苦労しています。それらがモナド変換子であることはわかりました。それが何を意味するのか理解できたと思いますが、実際にそれらを使用する方法を理解できないようです。私がやろうとしていることを表すおもちゃの例は次のとおりです。
ここでresolveEither
は、次のタイプがあります。
runEitherT $ resolveEither "ref"
タイプは次のとおりです。
ただし、これにより次のエラーが発生します。
解決方法や回避方法がわかりません。
特に、実装ではなく使用の観点からモナドトランスフォーマーを扱うチュートリアルへのポインターを歓迎します。
編集:
dfeuer と Christian の回答に対するコメントを反映するために、main を次のように変更してもエラーが発生します。
私が今得るエラーは次のとおりです。
ここでは、コメントよりも優れたコードの書式設定がはるかに簡単であるため、コメントと同様に質問を編集しています。
haskell - Haskell: `>>=` 演算子の型について混乱
私はいくつかの入門的な Haskell 資料に取り組んでおり、現在モナドを検討しています。>>=
演算子が次のタイプであることを概念的に理解しています。
(Monad m) => m a -> (a -> m b) -> m b
.
そのコンテキストでは、次のコードが機能する理由、つまり型の不一致が発生しない理由について混乱しています。
がわかっているのでgetLine :: IO String
、 type の関数で「バインド」できると思いString -> IO String
ます。ただしputStrLn
、タイプは異なります: putStrLn :: String -> IO ()
.
では、なぜ Haskell は>>=
これら 2 つの関数を使用できるようにしているのでしょうか?
haskell - IO モナドでミュータブルな構造を扱う方法
TL;DR:特定のステートメント内で(from )
によって生成された値の永続性を確保するにはどうすればよいですか? randomRIO
System.Random
do
IO モナドで変更可能な構造を操作するにはどうすればよいですか?
私の最初の質問は (非常に) 間違っていました。IO モナドで可変構造を使用することを理解したい将来の読者がこの投稿を見つけられるように、タイトルを更新しています。
より長いバージョン:
注意: これは長く見えますが、その多くは、私がどのように機能するかの概要を示しているだけですexercism.io
。(更新: 最後の 2 つのコード ブロックは私のコードの古いバージョンであり、将来の読者がコメント/回答に基づいてコードの反復を追跡したい場合に備えて、参照として含まれています。)
演習の概要:
私はRobot Name
(非常に有益な)exercism.ioのエクササイズに取り組んでいます。この演習Robot
では、ランダムに生成された名前を格納できるデータ型を作成します (演習Readme
は以下に含まれています)。
慣れていない方のために説明すると、exercism.io
学習モデルは、学生が生成したコードの自動テストに基づいています。各演習は一連のテスト (テスト作成者が作成) で構成されており、ソリューション コードはそれらすべてに合格する必要があります。コードは、次の演習 (効果的なモデル、imo) に進む前に、特定の演習のテスト ファイル内のすべてのテストに合格する必要があります。(Robot Name
演習#20程度です。)
この特定の演習では、Robot
データ型とそれに付随する 3 つの関数を作成するよう求められます: mkRobot
、robotName
およびresetName
。
mkRobot
のインスタンスを生成しますRobot
robotName
無名の一意の名前を生成して「返します」Robot
(つまり、robotName
既存の名前を上書きしません)。にすでに名前がある場合はRobot
、単に既存の名前を「返す」resetName
既存の名前を新しい名前で上書きします。
この特定の演習では、7 つのテストがあります。テストでは、次のことを確認します。
- 0)
robotName
指定されたパターンに適合する名前を生成します (名前は 5 文字の長さで、2 文字の後に 3 桁の数字が続きます。たとえば、AB123、XQ915 など)。 - 1) によって割り当てられた名前
robotName
は永続的です (つまり、ロボット A を作成し、 を使用して彼 (または彼女) に名前を割り当てるとしましょうrobotName
。(ロボット A で) 2 回目に呼び出しrobotName
ても、彼の名前は上書きされません) 。 - 2)
robotName
さまざまなロボットに固有の名前を生成します (つまり、プロセスを実際にランダム化していることをテストします)。 - 3)
resetName
指定されたパターンに適合する名前を生成します (テスト #0 と同様) - 4) によって割り当てられた名前
resetName
は永続的です - 5)
resetName
別の名前を割り当てる (つまり、resetName
ロボットに現在の名前とは異なる名前を付ける) - 6)
resetName
一度に 1 つのロボットにのみ影響します (つまり、ロボット A とロボット B があるとします。ロボット A の名前をリセットしても、ロボット B の名前には影響しません) かつ (ii) によって生成された名前resetName
は永続的です。
参考までに、テスト自体は次のとおりです: https://github.com/dchaudh/exercism-haskell-solutions/blob/master/robot-name/robot-name_test.hs
私が立ち往生している場所:
バージョン 1 (元の投稿): 現時点では、私のコードは 3 つのテスト (#1、#4、および #6) で失敗します。これらはすべて、ロボットの名前の永続性に関係しています。.
バージョン 2: (暫定) 私のコードは 1 つのテスト (#5) でのみ失敗します。テスト 5 は、既に作成したロボットの名前の変更に関係してい
ます (クリーンアップに役立つ有益なコメントをしてくれた bheklikr に感謝します)。バージョン 1)
バージョン 3 (最終版):以下の Cirdec の詳細な投稿のおかげで、コードは修正されました (すべてのテストに合格しました)。将来の読者の利益のために、コードの最終バージョンと以前の 2 つのバージョンを含めます (さまざまなコメント/回答を追跡できるようにするため)。
バージョン 3 (最終版): これは、以下の Cirdec の回答に基づく最終版です (これを読むことを強くお勧めします)。私の最初の質問 (System.Random を使用して永続変数を作成する方法を尋ねた) は、最初の実装が適切でなかったため、完全に間違っていたことがわかりました。私の質問は、代わりに IO モナドで変更可能な構造を操作する方法を尋ねる必要がありました (Cirdec が以下で説明しています)。
バージョン 2 (暫定):mkRobotName
関数をクリーンアップし、mkRobot 関数の修正を開始するのに役立つ
bheklikr のコメントに基づいています。このバージョンのコードは、テスト #5 でのみエラーを発生させました。テスト #5 はロボットの名前の変更に関係しているため、変更可能な構造が必要になります...
バージョン 1 (オリジナル) : 振り返ってみると、これは笑えるほどまずいです。このバージョンは、ロボットの名前の永続性に関連するすべてのテスト #1、#4、および #6 で失敗しました。
haskell - `IO` コードの `Maybe` 値のケースを使用した「階段状」のリファクタリング
次の関数は、関数を 2 回使用して を 2 回f
読み取ろうとしますが、one の読み取りに成功した後、実行を「ショートサーキット」します。Int
IO (Maybe Int)
Int
このコードをリファクタリングする良い方法はありますか? これを 3 回の試行に拡張すると、非常に面倒なことになります…</p>
(私の思考プロセス: この「階段」を見ると、おそらく のMonad
インスタンスを使用する必要があることがわかりますMaybe
が、これは既にIO
モナドにあるため、 MaybeT
(?) を使用する必要があります。しかし、必要なのはtoの1 つreadInt
だけです。成功するので、Maybe
最初にエラーになるというモナドの振る舞いはNothing
ここでは間違っているでしょう...)
haskell - ゲスマイナンバー 単発頭痛
Haskell で自分のスキルをテストするために、 Land of Lisp / Realm of Racketで見つけた最初のゲームを実装したいと決めました。「マイナンバー当てゲーム」。ゲームは、ユーザーが考えている値に合わせてプログラムの上限と下限を常に更新する必要があるため、可変状態に依存して実行されます。
次のようになります。
現在、Haskell ではこの種のこと (私の知る限り) は完全に可能ではありません。グローバルな可変状態を変更する REPL から何らかの関数を呼び出し、その直後に結果を出力します。これは、不変性の原則に違反しているためです。したがって、すべての相互作用はIO
and/orState
モナド内になければなりません。そして、それが私が立ち往生しているところです。
IO
モナドとモナドを組み合わせることに頭を悩ませているようには思えないState
ので、同じ関数で入力を取得し、結果を出力し、状態を変更することができます。
これが私がこれまでに得たものです:
私が今しなければならないことは、
- 初期推測を出力する
- より小さな/より大きな数を望むコマンドを受け取る
- それに応じて状態を変更する
- 関数を再帰的に呼び出して、再度推測する
IO
これを実現するためにとState
をエレガントな方法で組み合わせるにはどうすればよいですか?
注: これはおそらく状態をまったく使用しなくても達成できることを認識しています。でもオリジナルに忠実にしたい
haskell - カスタム型を使用せずに StateT の動作をエミュレートすることは可能ですか?
次の 2 つの関数、加算と減算がある場合、それらをチェーンして入力に対して一連の計算を実行するのは簡単です。
各計算が完了した後に状態を出力したい場合は、StateT
モナド変換子を使用します:
この「計算と印刷の組み合わせ」をStateT
カスタムデータ型なしで複製することは可能ですか?
私が知る限り、 をMaybeT IO a
使用して実行できるすべてのプロセスを実行することは可能ですIO (Maybe a)
が、それは単にネストされたモナドであるためのようです。一方で、とは根本的に異なるStateT
ため、代替手段がない場合があります。s -> (a,s)
s -> m (a,s)
コードが進む可能性のある方向は 2 つしかわかりません:State Int (IO ())
またはを使用していますIO (State Int ())
が、これらの実装を考えると、これらはどちらも無意味に見えますStateT
不可能だと思います。私は正しいですか?
注: これが完全に非現実的であることは承知していますが、数時間作業を行っても解決策を見つけることができませんでした。これは、私が正しいか、そのタスクに対して私のスキルが十分でないことを意味します。
scala - Scalaz の Tower[A] と IvoryTower とは?
ソース コードを調べたところ、次のシグネチャをscalaz.effect.IO
持つメソッドがあることに気付きました。apply
Tower[A]
次のようにIvoryTower
定義されます。
のインスタンスが 1 つありますTower
。
これらのクラスの目的は何ですか? IO.apply
が type の引数を受け入れるのはなぜTower[IvoryTower]
ですか?