我有一个名为TaskMonad的Monad,定义如下:
data TaskMonad a = TaskMonad (Environment -> (TaskResult a, Environment))我已经为TaskMonad定义了Functor、Applicative和Monad实例,现在我希望能够将这个monad与其他monad(例如IO)组合在一起,所以我定义了一个新
假设您有一个类型的T a,它可以给出一个Monad实例。由于每个monad都是通过赋值Applicative和(<*>) = ap来实现的,然后每个应用程序都是通过fmap f x = pure f <*> x定义的Functor,所以最好先定义Monad实例,然后再给出Applicative和Functor的T实
参照以下代码,
在函数result_sm :: (Monad m) => a -> State m s a中,我希望将类型变量m推断为State s。State s是Monad类型集的一个实例,那么它为什么不能工作呢?另外,关于Functor (StateM m s)的实例声明,我知道编译器不能从Monad m内建(自然/未重写) fmap类型签名绑定的上下文Functor m
根据 (和其他来源)的说法,Applicative在逻辑上属于类型类层次结构中的Monad和Pointed (因此Functor),所以如果Haskell的前奏是今天写的,那么理想的情况是这样的:liftA :: (Applicative f) => (a -> b) -> f a -> f b
liftM :: (Monad m
我想我应该尝试一下有趣的包,为data Pair a = Pair a a给出的函数器定义一个Monad和Comonad实例,它可以用Bool表示;正如在对的回答中提到的那样。我注意到的第一件事是,为了使我的类型成为Representable的实例,我不仅应该定义tabulate和index,还应该确保我的类型是Indexable、Distributive、Keyed、Apply、Applicative</e