問題タブ [monad-transformers]
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 の $ を理解する
次のコードを理解するのが少し難しいです (IO の上に重ねられた ErrorT モナドで実行されます):
>>
よりも優先度が高い$
。それで、Bool True
最初に IO にラップされてから持ち上げられますか、liftIO
それともhClose
最初に持ち上げられますか? つまり、IO モナドまたは ErrorT モナドで実行されますか>>
?return
haskell - カスタムモナド変換子を MonadError のインスタンスにする
変換されたモナドがインスタンスである場合、モナド変換子をインスタンスにしたいと考えてMonadError
います。基本的に、トランスフォーマーが組み込みのトランスフォーマーと同じように動作するようにします。たとえば、次のMonadError
インスタンスがありますStateT
。
私はこれをやってみました:
しかし、GHC は決定不能なインスタンスについて不平を言い始めました。明らかに MTL ライブラリは決定不能なインスタンスを有効にするだけですが、それを回避する方法はありますか? それとも、この場合は問題なく問題ないのでしょうか?
haskell - リーダーを使用したServerPartTモナドの拡張
Happstackサーバーを作成していて、接続するMongoDBデータベースがあります。そのために、接続プールを作成する関数を作成しました
そしてAction
、作成されたプールでを実行する関数:
pool
これには、すべてのルートでパラメータとしてを実行する必要があることは明らかです。私はそれをにラップしたいReaderT
ので、それrunDB
はのようなタイプAction IO a -> ServerPart (Either Failure a)
またはそれ以上のタイプを持つことができAction IO a -> ServerPart a
、失敗すると自動的にHTTPエラー500が発生します。
それをどのように達成できるかについて頭を悩ませています。Haskellモナドとhappstackの経験が豊富な人からのヒントが欲しいです。
ありがとう。
haskell - エラー値を ErrorT モナド変換子に持ち上げる
次のコードを書いていることに気付いたので、モナド変換子の基本的な理解が欠けていると思います。
これは機能しますが、もっとエレガントにできると思います。liftError
特に、自分で定義する必要はないと思うの代わりを探しています。
gateway
タイプを変更せずに作成してinner
連携する最も簡単な方法は何ですか?
haskell - 「関数の依存関係を使用して結合するときに型を一致させることができませんでした」というエラーはどういう意味ですか?
現在、受講しているコース用の小さなコンパイラを作成しています。そこで、型チェックを処理するためにこのモナド変換子を書き始めましたが、非常に不可解な型エラーが発生しました。私が本当によく知らない機能的な依存関係を含む何か。エラーを再現できるプログラムからの小さな抜粋:
そして実際のメッセージ:
python - Maybe モナドと seq モナドの組み合わせ: 出力で混乱する
エラーを返す可能性のあるもののリスト内包表記を行うために、seq-m と error-m を構成しようとしています。私の出力には予期しないタイプがありますが、それ以外は実際には賢明なようです。私は以下のコードを展開しましたが、ここにも作業の要点があります。
ここに私のモナドビジネスロジックがあります
出力
タプルのリストが表示されることを期待しています-リストはリスト内包表記の結果であり、最終リストの各項目はエラーモナド(value, error
タプル)の値である必要があります。1 つ多すぎるレベルのネストが によって削除されたかのようseq_bind
です。
これがモナドの私の定義です。正しくない場合、両方のモナドが単独で機能し、結合されていないため、非常に近いものです。
モナド API
また、コードを改善する方法を探しています。haskell と clojure のタグ付けは、これらの言語では慣用的であるためです。python コミュニティはこれに関心がありません。
haskell - attoparsec パーサーに IO を適切に追加するには?
attoparsec パーサーでトレース/デバッグを行いたいと考えています。これは最小限の[ない]動作例です:
パーサーで IO アクションを使用するにはどうすればよいですか?
haskell - 小さな命令型言語の通訳者
こんにちは、Haskell で C ライクな静的型付け言語のインタープリターを書いています。コードの実行前に型チェックを実行したいのですが、いくつか問題があります。まず、以下に私の抽象構文からの型定義をいくつか示します。
TCM は、エラーを報告し、環境を渡すためのものです。
今、式のタイプをチェックしたいので、チェックを実行する次の関数があります:
1 つを除くすべてのケースに対して定義されます。
私はここで立ち往生しています。私がすべきだと思うのは、f の型をチェックすることです (つまり、最初にそれが本当に関数かどうかをチェックするということです)。f の定義に記録されている引数の型が、実際に渡される引数の型と一致するかどうかを確認します。残念ながら、私は Haskell の初心者であり、正しい方法で表現する方法がわかりません。どんな提案でも大歓迎です:)
編集: わかりました、以前ここに書いたことには暗示されていないかもしれませんが、EFuncWithParams Ident [Exp] は実際には関数呼び出しであり (はい、多少誤解を招くことはわかっています)、 f(2 + 3, a, b[0]) であり、これが TFunction [Exp] を使用した理由です。関数の宣言と定義はステートメントであり、次のように定義されます。
ここで、宣言子は次のとおりです。
パラメータ宣言は Type_specifiers と Idents のリストです
私がすべきだと思うのは、宣言を確認しながら関数型をマップに保存し、ここでフェッチすることです。私も持っていることを意味します:
問題は、型チェック ステートメント用の別の関数があり、ある関数 (typeof_stm など) で使用されるマップが別の関数 (typeof など) に自動的に渡されるかどうか疑問です。これが起こる方法はないと思いますが、間違っているかもしれません。
haskell - 一時停止モナド
モナドは多くの驚くべき、クレイジーなことをすることができます。それらは、値の重ね合わせを保持する変数を作成できます。それらはあなたがそれを計算する前にあなたが未来からのデータにアクセスすることを可能にすることができます。彼らはあなたが破壊的な更新を書くことを可能にすることができますが、実際にはそうではありません。そして、継続モナドはあなたが人々の心を壊すことを可能にします!通常はあなた自身のものです。;-)
しかし、ここに課題があります。一時停止できるモナドを作成できますか?
Pause
モナドは一種の状態モナドです(したがって、mutate
明白なセマンティクスを備えています)。通常、このようなモナドには、計算を実行して最終状態を返す、ある種の「実行」関数があります。ただしPause
、違います。step
魔法の関数を呼び出すまで計算を実行する関数を提供しyield
ます。ここで計算は一時停止され、後で計算を再開するのに十分な情報が呼び出し元に返されます。
さらに素晴らしい場合:呼び出し元が呼び出し間の状態を変更できるようにしstep
ます。(たとえば、上記の型署名はこれを可能にするはずです。)
ユースケース:複雑なことを行うコードを書くのは簡単なことがよくありますが、それを変換して操作の中間状態も出力するための完全なPITAです。ユーザーが実行の途中で何かを変更できるようにしたい場合、物事は非常に速く複雑になります。
実装のアイデア:
明らかに、それはスレッド、ロック、およびで行うことができます
IO
。しかし、もっとうまくやれるでしょうか?;-)継続モナドで何かおかしなことはありますか?
たぶん、ある種のライターモナドで、現在の状態をログに記録するだけで、ログ内の状態を反復処理することで、その
yield
ふりをすることができます。step
(明らかに、これにより、ステップ間で状態を変更することはできなくなります。これは、現在、実際には何も「一時停止」していないためです。)
haskell - MonadReader/MonadErrorインスタンスをTransformerタイプに追加する
Happstackで作業するときはいつものように、ハンドラーに使用する独自のサーバーモナドを作成し、DBとセッション、およびいくつかのエラー処理をカバーしています。私は最近happstack-clientsession
、大きな助けになり、自分のソリューションを書くのを妨げる-Packageを発見しました。
ClientSessionT
モナドで自分自身に配線するのに少し問題がありますが。結局のところ、そのためのインスタンスはMonadReader
ないMonadError
ので、ラッパーモナドでインスタンス化することはできません。
モジュールの完全なコードは次のとおりです。
私が得ているエラーは明らかです:からの派生MonadError
とMonadReader
は機能しません。しかし、私はそれらが必要です。さもなければ、全体のパフォーマンスはちょっと役に立たないです。
私はこれらがどのように行われるのか(そしてそれに依存するのかderiving
)を理解することができなかったので、この特定の問題をカバーし、それが一般的にどのように行われるのかを教えてくれる答えが欲しいです。