根据绑定

时间:2015-12-05 07:03:33

标签: haskell monads

我想尝试定义Monad,让我们称之为MyData

MyData内部,正在进行一些IO操作,执行它们的函数runMyMonad

当然,我必须使用以下类型签名来定义>>=

instance Monad MyData ...
(>>=) :: MyData a -> (a -> MyData b) -> MyData b

我特别喜欢定义Monad,因为我希望用户能够使用" do"符号

问题是,要实际做我想做的事情,我需要知道完全取决于b类型的一些信息。如下所示:

myfunc (undefined :: b)

我可以像这样创建一个类型类,但是那时会出现问题,我的Monad不再有效,因为Monad要求ab不受限制。

我可以创建MyData,如下所示:

data MyData a where
  MyData :: (MyTypeClass a) => a -> a -> MyData a

或类似的东西。这样当我对它进行模式匹配时,我就免费获得了类型类。但是我只能在>>=的第一个参数上看到这个,因为第二个参数包含在一个函数中。

所以这就是我想要做的事情:

a)能够应用仅依赖于b>>=类型的函数。
b)能够使用do符号 c)不影响Monad的其他用途。

任何想法都将受到赞赏。

0 个答案:

没有答案