問題タブ [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.
haskell - Cofree アノテーションを使用して AST を操作するには?
私はこの単純なExpr
AST を持っており、簡単に に変換できますString
。
ここで、追加のデータを追加したいと思います。だから私は使用しようとしていますCofree
に変換できExpr
ますExpr2
Expr2
しかし、私はに変換する方法を理解できませんString
また、Cofree はこの注釈の問題を解決する最良の方法ですか?
haskell - Haskell での Cofree CoMonad の動機付けの例は何ですか?
私は で遊んでいますがCofree
、まったく理解できません。
たとえばCofree [] Num
、ghci で遊びたいのですが、興味深い例がまったく得られません。
たとえば、Cofree 型を作成すると、次のようになります。
私は期待extract a == 1
しますが、代わりに次のエラーが発生します。
そして次のタイプ:
Cofree をファンクターと一緒に使用する方法について、些細なことでも簡単な例をいくつか入手できますか[]
?Maybe
Either
extract
extend
unwrap
duplicate
?
クロス投稿: https://www.reddit.com/r/haskell/comments/4wlw70/what_are_some_motivating_examples_for_cofree/
編集: David Young のコメントに導かれて、ここに私の最初の試みが間違っていた場所を示すいくつかのより良い例がありますが、Cofree の直感を導くことができるいくつかの例が大好きです:
haskell - バイコモナスの方法は何ですか?
これに提案するより便利な標準クラスを考えながら
何かVectorSpace
-yまたはの代わりにR2
、より一般的な獣がここに潜んでいるのではないかと思いました: a にはType -> Type -> Type
、含まれている 2 つの型の両方を抽出することができます。うーん、もしかしたら彼らはextract
edできるの?
どちらのパッケージにも と呼ばれるものが含まれcomonad
ていないことが判明しました。質問は、そのようなクラスはカテゴリ理論的に意味があるでしょうか? (これも定義されておらず、どのように見えるかを実際に確認できませんでした)とは異なり、単純な定義はもっともらしいようです:bifunctors
Bicomonad
Bimonad
おそらく法律で
しかし、 の結果の両方のフィールドにbidup
同じ型が含まれており、他にもおそらく「より良い」と考えられるシグネチャがかなりの数あることに不安を覚えます。
何かご意見は?
haskell - 失敗モナド上のフリーコモナドを「値ストリームと最終エラー」に分解する一般的な方法はありますか?
Cofree
comonad は、エラー型で多態的な方法で部分関数を反復するのに役立ちます。これはエラー モナドでのループに似ていますが、生成された値を純粋/遅延的な方法で収集し、データ構造体の最後にエラーが表示されるだけですcoiter
。forM
たとえば、Cofree Identity
(失敗は許可されません!) は無限ストリームですが、Cofree Maybe
は と同形NonEmpty
であり、Cofree (Either e) a
基本的には(NonEmpty a, e)
(成功した反復値のリストと最後に発生するエラー) です。
ここで、単一のエラーモナドで特定のパターンマッチングを行わずに、結果を評価する最良の方法は何だろうと考えています。インスタンスのおかげですべての値を抽出するのは非常に簡単ですがFoldable
(例: )、エラーtoList
を取得する最善の方法がわかりません。それを悪用して、値を取り除き、エラー部分を残すことができます。Foldable
しかし、これは少しハックな気がします。より良い解決策はありますか?
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 b
bind
return
pure
理想的には、 asComonad
を使用できるようにインスタンスを作成するのが最善のように思えますが、私には理解できないので困っています。extract :: Monad m => m a -> a
pipe = extract $ connect $ def {creds}
(<-)
もう1つの奇妙な点は、(<-)
haskell関数として扱うと、最初の引数が範囲外の変数であるということですが、それはそれを意味するものではありません
何でも自由変数として使用できるわけではないからです。たとえば、パイプをNum
型やBool
. 変数は、実際にはString
;ではないことを除いて、「文字列」っぽいものでなければなりません。実際ににバインドしようとすることは絶対にできませんString
。したがって、通常の意味での haskell 関数ではないように見えます (自由変数の名前空間から値を取得する関数のクラスがない限り... 可能性は低いです)。では、(<-)
正確には何ですか?を使用して完全に置き換えることはできますextract
か? それは脱糖/回避する最良の方法ですか?