問題タブ [comonad]

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

haskell - Cofree アノテーションを使用して AST を操作するには?

私はこの単純なExprAST を持っており、簡単に に変換できますString

ここで、追加のデータを追加したいと思います。だから私は使用しようとしていますCofree

に変換できExprますExpr2

Expr2しかし、私はに変換する方法を理解できませんString

また、Cofree はこの注釈の問題を解決する最良の方法ですか?

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

haskell - Haskell での Cofree CoMonad の動機付けの例は何ですか?

私は で遊んでいますがCofree、まったく理解できません。

たとえばCofree [] Num、ghci で遊びたいのですが、興味深い例がまったく得られません。

たとえば、Cofree 型を作成すると、次のようになります。

私は期待extract a == 1しますが、代わりに次のエラーが発生します。

そして次のタイプ:

Cofree をファンクターと一緒に使用する方法について、些細なことでも簡単な例をいくつか入手できますか[]?MaybeEither

  • extract
  • extend
  • unwrap
  • duplicate?

クロス投稿: https://www.reddit.com/r/haskell/comments/4wlw70/what_are_some_motivating_examples_for_cofree/

編集: David Young のコメントに導かれて、ここに私の最初の試みが間違っていた場所を示すいくつかのより良い例がありますが、Cofree の直感を導くことができるいくつかの例が大好きです:

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

haskell - バイコモナスの方法は何ですか?

これに提案するより便利な標準クラスを考えながら

何かVectorSpace-yまたはの代わりにR2、より一般的な獣がここに潜んでいるのではないかと思いました: a にはType -> Type -> Type、含まれている 2 つの型の両方を抽出することができます。うーん、もしかしたら彼らはextractedできるの?

どちらのパッケージにも と呼ばれるものが含まれcomonadていないことが判明しました。質問は、そのようなクラスはカテゴリ理論的に意味があるでしょうか? (これも定義されておらず、どのように見えるかを実際に確認できませんでした)とは異なり、単純な定義はもっともらしいようです:bifunctorsBicomonadBimonad

おそらく法律で

しかし、 の結果の両方のフィールドにbidup同じ型が含まれており、他にもおそらく「より良い」と考えられるシグネチャがかなりの数あることに不安を覚えます。

何かご意見は?

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

haskell - 失敗モナド上のフリーコモナドを「値ストリームと最終エラー」に分解する一般的な方法はありますか?

Cofreecomonad は、エラー型で多態的な方法で部分関数を反復するのに役立ちます。これはエラー モナドでのループに似ていますが、生成された値を純粋/遅延的な方法で収集し、データ構造体の最後にエラーが表示されるだけですcoiterforM

たとえば、Cofree Identity(失敗は許可されません!) は無限ストリームですが、Cofree Maybeは と同形NonEmptyであり、Cofree (Either e) a基本的には(NonEmpty a, e)(成功した反復値のリストと最後に発生するエラー) です。

ここで、単一のエラーモナドで特定のパターンマッチングを行わずに、結果を評価する最良の方法は何だろうと考えています。インスタンスのおかげですべてのを抽出するのは非常に簡単ですがFoldable(例: )、エラーtoListを取得する最善の方法がわかりません。それを悪用して、値を取り除き、エラー部分を残すことができます。Foldable

しかし、これは少しハックな気がします。より良い解決策はありますか?

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

haskell - モナドの自然変換に関する Haskell の (<-)

私はGHCiのhasboltモジュールをいじっていて、いくつかの脱糖に興味がありました。次のようにパイプを作成して、Neo4j データベースに接続しています。

そしてそれはうまくいきます。しかし、(<-)演算子の型が何なのか気になります (GHCi は教えてくれません)。ほとんどの脱糖の説明は、

脱糖する

しかし、行だけはx <- aどうですか?returnしたくpipe :: Pipeないのでを追加しても役に立ちませんが、 and /を使用して脱糖しようとするとpipe :: Control.Monad.IO.Class.MonadIO m => m Pipe、それなしでは機能しません。(>>=) :: Monad m => m a -> (a -> m b) -> m bbindreturnpure

理想的には、 asComonadを使用できるようにインスタンスを作成するのが最善のように思えますが、私には理解できないので困っています。extract :: Monad m => m a -> apipe = extract $ connect $ def {creds}(<-)

もう1つの奇妙な点は、(<-)haskell関数として扱うと、最初の引数が範囲外の変数であるということですが、それはそれを意味するものではありません

何でも自由変数として使用できるわけではないからです。たとえば、パイプをNum型やBool. 変数は、実際にはString;ではないことを除いて、「文字列」っぽいものでなければなりません。実際ににバインドしようとすることは絶対にできませんString。したがって、通常の意味での haskell 関数ではないように見えます (自由変数の名前空間から値を取得する関数のクラスがない限り... 可能性は低いです)。では、(<-)正確には何ですか?を使用して完全に置き換えることはできますextractか? それは脱糖/回避する最良の方法ですか?