タグ付けされた質問 「monads」

プログラミングのモナドは、合成可能な計算の記述です。モナドは、Haskellのような関数型プログラミング言語の重要な構成要素です。

5
インデックス付きモナドとは何ですか?
とは インデックス付きモナドとですか?このモナドの動機は? 私はそれが副作用を追跡するのに役立つことを読みました。しかし、型シグネチャとドキュメンテーションは私をどこにも導きません。 副作用の追跡に役立つ例(または他の有効な例)は何ですか?
98 haskell  monads 

3
HaskellでControl.Monad.Writerを使用する方法
私は関数型プログラミングが初めてで、最近Learn You a Haskellで学習しましたが、この章を通過したとき、以下のプログラムに行き詰まりました。 import Control.Monad.Writer logNumber :: Int -> Writer [String] Int logNumber x = Writer (x, ["Got number: " ++ show x]) multWithLog :: Writer [String] Int multWithLog = do a <- logNumber 3 b <- logNumber 5 return (a*b) これらの行を.hsファイルに保存しましたが、それをghciにインポートできませんでした。 more1.hs:4:15: Not in scope: data constructor `Writer' …
96 haskell  monads 

3
mtl、transformers、monads-fd、monadLib、および選択したパラドックス
Hackageにはモナド変換のためのいくつかのパッケージがあります: mtl:モナド変換ライブラリ トランスフォーマー:コンクリートファンクターおよびモナドトランスフォーマー monads-fd:関数の依存関係を使用するモナドクラス monads-tf:タイプファミリーを使用するモナドクラス monadLib:モナド変換子のコレクション。 mtl-tf:タイプファミリーを使用するモナド変換ライブラリ。 mmtl:モジュラーモナド変換ライブラリ mtlx:タイプインデックス付きのモナド変換ライブラリ。「無料」のコピーを提供します。 compose-trans:合成可能なモナド変換子 (そしておそらく私はいくつかを逃した) どれを使用しますか? mtlはHaskellプラットフォームの1つですが、redditはクールではないと聞いています。 とにかく、選択の何が悪いのですか、それはただ良いことではありませんか? ええと、たとえば、データアクセサーの作成者がこれらすべてを、人気のある選択だけに応えるために作成しなければならない方法を見ました。 data-accessor-monadLibライブラリ:monadLibのモナドのアクセサ関数 data-accessor-monads-fdライブラリ:アクセサを使用してモナドfd状態モナドクラスの状態にアクセスする data-accessor-monads-tfライブラリ:アクセサーを使用してモナドtf状態モナドタイプファミリーの状態にアクセスする data-accessor-mtlライブラリ:Accessorを使用してmtl Stateモナドクラスの状態にアクセスする data-accessor-transformersライブラリ:アクセサーを使用してトランスフォーマーの状態モナドの状態にアクセスする これが続き、たとえばいくつかの競合するArrowパッケージが進化した場合、spoonklink-arrows-transformers、spoonklink-arrows-monadLib、spoonklink-tfArrows-transformers、spoonklink-tfArrows-monadLib、...のように見えるかもしれません。 そして、spoonklinkがフォークされると、Hackageがディスク領域を使い果たしてしまうのではないかと心配しています。:) 質問: なぜそれほど多くのモナド変換パッケージがあるのですか? なぜmtlはクールでないと考えられていますか? 主な違いは何ですか? これらの競合しているように見えるパッケージのほとんどは、Andy Gillが作成し、Ross Patersonが保守しています。これは、これらのパッケージが競合しているのではなく、何らかの方法で連携していることを意味しますか?AndyとRossは、独自のパッケージを廃止されたと見なしていますか? あなたと私はどちらを使うべきですか?

3
状態、ST、IORef、MVarの違い
私は48時間でスキーマの作成に取り組んでいます(最大で約85 時間です)、変数と割り当ての追加に関する部分にたどり着きました。この章には大きな概念的なジャンプがあります。最終的なソリューションに直接ジャンプするのではなく、2つのステップで適切なリファクタリングを行って実行したいと思います。とにかく… :私は、同じ目的を果たすように見える別のクラスの数を失ってもらいましたState、ST、IORef、とMVar。最初の3つはテキストで言及されていますが、最後の3つは、最初の3つに関する多くのStackOverflowの質問に対する好ましい回答のようです。それらはすべて、連続した呼び出しの間に状態を運ぶようです。 これらはそれぞれ何であり、どのように互いに異なるのですか? 特に、次の文は意味がありません。 代わりに、状態スレッドと呼ばれる機能を使用して、Haskellに集約状態を管理させます。これにより、関数を使用して変数を取得または設定し、他のプログラミング言語と同様に可変変数を処理できます。 そして IORefモジュールを使用すると、IOモナド内でステートフル変数を使用できます。 これらすべてにより、行がtype ENV = IORef [(String, IORef LispVal)]混乱します-なぜ2番目IORefですか?type ENV = State [(String, LispVal)]代わりに書くと何が壊れますか?

5
for-内包表記からflatMap / Mapへの変換と混同される
MapとFlatMapを理解していないようです。私が理解していないのは、for-incomhensionがmapとflatMapへのネストされた呼び出しのシーケンスであるということです。次の例は、Scalaの関数型プログラミングの例です def bothMatch(pat:String,pat2:String,s:String):Option[Boolean] = for { f <- mkMatcher(pat) g <- mkMatcher(pat2) } yield f(s) && g(s) に翻訳する def bothMatch(pat:String,pat2:String,s:String):Option[Boolean] = mkMatcher(pat) flatMap (f => mkMatcher(pat2) map (g => f(s) && g(s))) mkMatcherメソッドは次のように定義されます。 def mkMatcher(pat:String):Option[String => Boolean] = pattern(pat) map (p => (s:String) => p.matcher(s).matches) そして、パターンメソッドは次のとおりです: import java.util.regex._ def pattern(s:String):Option[Pattern] …

18
Option [T]クラスのポイントは何ですか?
Option[T]Scalaの授業のポイントがわかりません。つまり、私はNone以上の利点を見ることができませんnull。 たとえば、次のコードについて考えてみます。 object Main{ class Person(name: String, var age: int){ def display = println(name+" "+age) } def getPerson1: Person = { // returns a Person instance or null } def getPerson2: Option[Person] = { // returns either Some[Person] or None } def main(argv: Array[String]): Unit = { val p = …

5
モナドが合成の下で閉じられていないことを示す具体的な例(証拠付き)?
適用可能なファンクターは構成の下で閉じられますが、モナドは閉じられないことはよく知られています。しかし、モナドが常に構成されているとは限らないことを示す具体的な反例を見つけるのに苦労しています。 この答えは[String -> a]、非モナドの例として示しています。少し遊んだ後は直感的に信じますが、その答えは「結合は実装できない」と言っているだけで、正当な理由はありません。もっとフォーマルなものが欲しいのですが。もちろん、タイプの関数はたくさんあります[String -> [String -> a]] -> [String -> a]。そのような関数は必ずしもモナドの法則を満たさないことを示さなければなりません。 (証拠を伴う)どんな例でもかまいません。特に上記の例の証拠を必ずしも探しているわけではありません。

1
継続モナドを左と右の随伴に因数分解する方法は?
状態モナドは積(左-ファンクター)とリーダー(右-表現可能)に因数分解できます。 継続モナドを因数分解する方法はありますか?以下のコードは、チェックを入力しない私の試みです -- To form a -> (a -> k) -> k {-# LANGUAGE MultiParamTypeClasses, TypeOperators, InstanceSigs, TypeSynonymInstances #-} type (<-:) o i = i -> o -- I Dont think we can have Functor & Representable for this type synonym class Isomorphism a b where from :: a -> …

2
ハスケルの入れ子になった州
やや異なる種類の状態を持つ状態マシンのファミリーを定義しようとしています。特に、より「複雑な」状態機械には、より単純な状態機械の状態を組み合わせることによって形成される状態があります。 (これは、オブジェクトがオブジェクトでもあるいくつかの属性を持つオブジェクト指向の設定に似ています。) これが私が達成したいことの簡単な例です。 data InnerState = MkInnerState { _innerVal :: Int } data OuterState = MkOuterState { _outerTrigger :: Bool, _inner :: InnerState } innerStateFoo :: Monad m => StateT InnerState m Int innerStateFoo = do i <- _innerVal <$> get put $ MkInnerState (i + 1) return i outerStateFoo …

1
contではできないcallCCで何ができますか?
私は本当に本当にcallCCを理解するのに苦労しています。私は継続の力を得て、いくつかのプロジェクトでこのコンセプトを使用して、クールなコンセプトを作成しています。しかし、私よりも優れた機能を使用する必要はありませんでしたcont :: ((a->r)->r)-> Cont r a。 それを使用した後、彼らがCont Monadをすべてのモナドの母と呼んでいる理由はよくわかりますが、私はいつ使用する必要があるのか​​わかりませんcallCC。

1
Mにモナド的に自然な非同一モナドモーフィズムM〜> Mはありますか?
型シグネチャによる自然変換はa -> a恒等関数でなければならないことが知られています。これは米田補題に続くが、直接導出することもできる。この質問は同じ性質を求めますが、自然な変換ではなくモナド射を求めます。 モナドM ~> N間のモナド射を考えます。(これらはM a -> N a、両側でモナド演算を保持する自然な変換です。これらの変換は、モナドのカテゴリーの射です。)e :: (Monad m) => m a -> m aすべてのモナドで同じように機能するモナド射が存在するかどうかを確認できますm。言い換えると、モナドモーフィズムeは、モナドタイプパラメータでモナド的に自然でなければなりませんm。 モナド自然法則によれば、任意の2つのモナドMとNの間のモナドモーフィズムf:M a-> N aについてはf . e = e . f、適切な型パラメーターが必要 です。 問題は、そのようなeものは恒等関数でなければならないことを証明できるか、またはe次のように定義された非恒等モナド射の反例があるかどうかです。 e :: (Monad m) => m a -> m a e ma = ... そのような定義に失敗した試みの1つeは次のとおりです。 e ma = do …


1
Haskell-自動モナドインスタンス
Monadクラスの一部になる独自のデータ型を作成しようとしていますが、 newtype Container a = Container a deriving Monad 私にこのエラーを与えます: * Can't make a derived instance of `Monad Container' (even with cunning GeneralizedNewtypeDeriving): cannot eta-reduce the representation type enough * In the newtype declaration for `Container' | 30 | newtype Container a = Container a deriving Monad 他のクラス(たとえば、表示)では正常に機能しますが、モナドでは機能しません。コンテナをモナドクラスにインスタンス化するようにghciを説得するにはどうすればよいですか? ありがとう

1
ArrowとApplicativeとは異なり、相互イールドによってArrowApplyとMonadsが同等になるのはなぜですか?
これが私が参照するSOの投稿です。また、資料を分離しないために、その質問ではOPと同じスニペットを使用します。 インスタンスがモナドを生成すること、およびその逆が広く知られていArrowApplyます。 newtype ArrowMonad a b = ArrowMonad (a () b) instance Arrow a => Functor (ArrowMonad a) where fmap f (ArrowMonad m) = ArrowMonad $ m >>> arr f instance Arrow a => Applicative (ArrowMonad a) where pure x = ArrowMonad (arr (const x)) ArrowMonad f <*> ArrowMonad x …

3
MonadReaderを定義するためにFunctionalDependencyが必要なのはなぜですか?
クラスの定義を理解できた MonadReader class Monad m => MonadReader r m | m -> r where ... Haskellの関数型依存関係のドキュメントを読んだ後| m -> r、型変数rがによって一意に決定されることを指定していることが理解できますm。これまでに見たMonadReaderのいくつかの典型的なインスタンス(例:)に基づいて、この要件は妥当だと思いますがReader、Readerこの機能的な依存関係句がなくてもインスタンスを定義できるように思えます。 私の質問は、MonadReaderの定義に機能的な依存関係が必要な理由です。これは、MonadReaderを適切に定義できないという意味で、MonadReaderを定義するために機能的に必要ですか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.