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を説得するにはどうすればよいですか?
ありがとう
GenerlizedNewtypeDeriving具体的には、ラップされた型のインスタンスを新しい型に「持ち上げる」ためのものです。どのように(またはその場合)Monadインスタンスを自動的に導出できるかという問題Containerは、依然として興味深いものです。(明示的なインスタンスをbase定義するという事実は、あなたができないことを示唆しています。)MonadIdentity
MonadHaskell標準が自動的に派生できるようにするタイプクラスの1つではありません(Show他のいくつかの基本クラスと一緒に)。GHCは正しい拡張子でそれを行うことができますが、私は信じています。
@RobinZigmondメッセージ
—
アレクセイロマノフ
GeneralizedNewtypeDerivingが有効であることを示していることに注意してください。問題は、それがまだ機能しない理由です。
a、それがモナドのインスタンスではないため、あまり意味がありません。たとえばを使用する場合は、のインスタンスなnewtype Container a = Container [a] deriving (Functor, Applicative, Monad)ので機能[]しますMonad。