这个问题显示了一个实例定义(,) a b,其中a是一个实例Monoid.
但是,我不知道如何编写类似的东西(,) a b,并且b是一个实例Monoid?只要我能写出定义,我基本上可以这样做:
instance Monoid b => Monad ((,) ???) where
return a = (a,mempty)
~(a,b) >>= f = let (c,b1) in f a in (c,b `mappend` b1)
Run Code Online (Sandbox Code Playgroud)
所以问题是如何写这个???部分?
UPDATE
实际上这个问题是一个更通用的问题的特例:是否有可能编写类型类的实例,这些类作用于最终没有出现的某些类型?在我的例子中,类型构造函数是(,) a b,我想让它成为Monad awhere a不是最后一个类型参数的实例.
我们可以写,现在同义词的作品不适合这种情况,所以我们使用newtype:
newtype RevTuple b a = RevTuple { totuple :: (a , b) }
instance Monoid b => Monad (RevTuple b) where
return a = RevTuple (a,mempty)
(RevTuple (a,b)) >>= f =
let RevTuple (c,b1) = f a in RevTuple (c,b `mappend` b1)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
482 次 |
| 最近记录: |