我想尝试定义Monad,让我们称之为MyData
。
在MyData
内部,正在进行一些IO操作,执行它们的函数runMyMonad
。
当然,我必须使用以下类型签名来定义>>=
:
instance Monad MyData ...
(>>=) :: MyData a -> (a -> MyData b) -> MyData b
我特别喜欢定义Monad,因为我希望用户能够使用" do"符号
问题是,要实际做我想做的事情,我需要知道完全取决于b
类型的一些信息。如下所示:
myfunc (undefined :: b)
我可以像这样创建一个类型类,但是那时会出现问题,我的Monad不再有效,因为Monad要求a
和b
不受限制。
我可以创建MyData
,如下所示:
data MyData a where
MyData :: (MyTypeClass a) => a -> a -> MyData a
或类似的东西。这样当我对它进行模式匹配时,我就免费获得了类型类。但是我只能在>>=
的第一个参数上看到这个,因为第二个参数包含在一个函数中。
所以这就是我想要做的事情:
a)能够应用仅依赖于b
中>>=
类型的函数。
b)能够使用do
符号
c)不影响Monad
的其他用途。
任何想法都将受到赞赏。