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