Applicative是否可以通过MonadTransformer的Monad自然推导出来?
创始人
2024-09-11 04:32:42
0次

可以通过 MonadTransformer 的类型类约束来推导出它的 Applicative 实例。在一个 MonadTransformer 中,其内部 Monad 实现了 Functor 和 Applicative,因此可以在 MonadTransformer 类型类约束中将 Applicative 约束为 Monad 的实现类型。

具体的代码示例如下:

{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE FunctionalDependencies #-}
{-# LANGUAGE MultiParamTypeClasses #-}

import Control.Monad.Trans.Class
import Control.Monad.Trans.Maybe
import Control.Monad.Trans.Reader

class (Monad m, Applicative m) => MonadTrans' t m | t -> m where
  lift' :: (Monad n) => n a -> t n a

instance MonadTrans' MaybeT Maybe where
  lift' = MaybeT . liftM Just

instance MonadTrans' (ReaderT r) ((->) r) where
  lift' = ReaderT . const

在这个例子中,我们定义了一个 MonadTrans' 类型类,它有两个约束条件,一个是 Monad,另一个是 Applicative。在类型类的函数定义中,我们定义了一个 lift' 函数,它接受一个 Monad n 的计算,返回一个 t n a 类型的计算。我们还通过函数依赖声明 t -> m 来确保 t 与 m 类型是相同的。

然后,我们为 MaybeT 和 ReaderT 分别实现了 MonadTrans' 类型类的实例。在这些实例中,我们使用了 liftM 或 const 函数来实现 lift' 函数,从而为 Maybe 和 函数类型添加了一个 MonadTransformer 的 Monad 实例。因此,我们就可以通过 MonadTransformer 中的 Monad 自然推导出 Applicative 实例。

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...