如何用bind来定义apply?

2024-04-21

在 Haskell 中,Applicatives 被认为比 Functor 更强,这意味着我们可以使用 Applicative 来定义 Functor,例如

-- Functor
fmap :: (a -> b) -> f a -> f b
fmap f fa = pure f <*> fa

Monad 被认为比 Applicatives 和 Functor 更强,这意味着。

-- Functor
fmap :: (a -> b) -> f a -> f b
fmap f fa = fa >>= return . f

-- Applicative
pure :: a -> f a
pure = return

(<*>) :: f (a -> b) -> f a -> f b
(<*>) = ???  -- Can we define this in terms return & bind? without using "ap" 

我读到 Monad 是用于对动作进行排序的。但我觉得 Monad 唯一能做的就是 Join 或 Flatten,它的其余功能来自 Applicatives。

join :: m (m a) -> m a
-- & where is the sequencing in this part? I don't get it.

如果 Monad 真的用于排序操作,那么我们如何定义 Applicatives(不被认为是严格按顺序操作,某种并行计算)?

由于单子是内函子类别中的幺半群。还有可交换幺半群,它们不一定需要按顺序工作。这意味着可交换幺半群的 Monad 实例也需要排序?

Edit:我发现了一个很棒的页面http://wiki.haskell.org/What_a_Monad_is_not http://wiki.haskell.org/What_a_Monad_is_not


如果 Monad 真的用于排序操作,那么我们如何定义 Applicatives(不被认为是严格按顺序操作,某种并行计算)?

不完全的。所有 monad 都是 applicative,但只有一些 applicative 是 monad。因此,给定一个 monad,您始终可以根据以下方式定义应用实例bind and return,但是如果您拥有的只是应用实例,那么您无法在没有更多信息的情况下定义 monad。

monad 的应用实例如下所示:

instance (Monad m) => Applicative m where
   pure = return
   f <*> v = do
      f' <- f
      v' <- v
      return $ f' v'

当然这是评价f and v按顺序,因为它是一个 monad,而这就是 monad 所做的事情。如果这个应用不按顺序做事那么它就不是一个 monad。

当然,现代 Haskell 以相反的方式定义了这一点:Applicative类型类是一个子集Functor所以如果你有一个Functor你可以定义(<*>)那么你可以创建一个Applicative实例。Monad又被定义为Applicative,所以如果你有一个Applicative实例,你可以定义(>>=)那么你可以创建一个Monad实例。但你无法定义(>>=)按照(<*>).

See the 类型分类百科全书 https://wiki.haskell.org/Typeclassopedia更多细节。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何用bind来定义apply? 的相关文章

随机推荐

  • 如何使用multiple属性在Android上上传多个文件?

    I got a
  • 在 python 上使用 TensorRT .engine 文件进行推理

    我使用 Nvidia 的迁移学习工具包 TLT 进行训练 然后使用 tlt converter 将 etlt 模型转换为 engine 文件 我想使用这个 engine 文件在 python 中进行推理 但由于我使用 TLT 进行训练 因此
  • 合并冲突后暂存区中有哪些文件?

    我运行时与 file1 txt 发生冲突git merge b2当前分支是master ls files somcdt file1 txt然后显示 M 100644 4111d50ada6cc03ec6079f226c23efa3142c9
  • 是否可以在 LLVM IR 代码中指定十六进制数?

    例如 error floating point constant invalid for type 3 and i8 0x80 2 从扫描的红外参考手册 http llvm org docs LangRef html simple cons
  • 从 Java 方法返回多个值:为什么没有 n 元组对象?

    为什么没有一个 标准的 Java 认证的 解决方案作为 Java 语言本身的一部分 从 Java 方法返回多个值 而不是开发人员必须使用自己的方法 例如映射 列表 对等 为什么Java不支持n元组对象 特别是考虑可能一起 串联 修改两个对象
  • 防止PHP脚本被淹没

    我想防止我的脚本被淹没 如果用户按 F5 它每次都会执行脚本 我想防止这种情况并允许每 2 秒执行一个脚本 有什么解决方案吗 您可以使用内存缓存来执行此操作 简单的演示脚本 memcache new Memcache memcache gt
  • Typescript 中的 new() 是什么?

    我遇到了new 在官方文件中here https www typescriptlang org docs handbook generics html关于泛型 这是代码上下文 function create
  • javascript - 从输入类型=文件获取文件名和扩展名

    我有一个文件上传输入 当我单击浏览按钮并选择文件时 我希望文件名和扩展名显示在两个输入文本框中 请参阅代码示例 它与扩展名一起正常工作 但文件名还显示了给我 fakepath 警告的路径 我明白为什么 但是有什么好方法可以做到这一点并将文件
  • 在 thymeleaf spring boot 中,动态轮播滑块不起作用

    In my spring boot thymeleaf this following code is slider does not work well Show the result in image What wrong with in
  • 您应该如何诊断错误 SEHException - 外部组件抛出异常

    每当用户报告错误时 例如 System Runtime InteropServices SEHException 外部组件引发的异常 作为一名程序员 我可以做些什么来确定原因吗 场景 一名用户 使用我公司编写的程序 报告了此错误 这可能是也
  • 从另一个页面访问时引导滚动间谍

    我试图链接到主页的特定部分 同时保持滚动间谍功能 有了这个代码 li a href sec1 About a li 滚动间谍正在运行 但如果我尝试从主页以外的页面访问它 它只会添加 sec1 到当前页面的 url 没有效果 如果我把它改成
  • 关于在单列中查找重复项的宏的建议

    发现了很多涉及在两列中查找重复项的问题 i e MS Excel 如何创建宏来查找重复项并突出显示它们 https stackoverflow com questions 2162684 ms excel how to create a m
  • 为什么numba cuda调用几次后运行速度变慢?

    我正在尝试如何在 numba 中使用 cuda 然而我却遇到了与我预想不同的事情 这是我的代码 from numba import cuda cuda jit def matmul A B C Perform square matrix m
  • ggpairs 中的数字四舍五入

    是否可以将 ggpairs 中的相关数字舍入为例如 2 位数字 library GGally ggpairs iris columns 1 4 mapping ggplot2 aes col Species 这是一个修改版本ggally c
  • 用于累积逗号分隔字符串的 C++ 预处理器宏

    我需要执行以下操作 const char my var Something REGISTER my var const char my var2 Selse REGISTER my var2 concst char all OUTPUT R
  • SSIS 错误 - 包中的版本号无效

    失败作业对应的日志如下 2014 年 4 月 11 日 06 40 00 LPR New 错误 0 USPHND0088 LPR New 作业 结果 作业失败 该作业由 Schedule 14 调用 LPR New Job 最后运行的一步是
  • 如何检测远程机器的操作系统

    从基于 net 的应用程序中 确定远程计算机上运行的操作系统是 Windows 还是 Linux 的最快方法是什么 只需 ping 一下即可 如果 TTL 生存时间 为 254 或更小 则它是基于 UNIX 的 如果 TTL 为 128 或
  • WPF:多显示器编程

    我在用着WPF in C 我想从多显示器编程开始 这意味着该应用程序将在许多具有不同视图的显示器上显示 我在网上搜索过 我得到了使用的方法Screen AllScreens 但是我有以下问题 有多种方法可以将多台显示器连接到 PC 情况 1
  • PDF 文件中的隐写术 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 有人能告诉我 哪里可以将一些数据隐藏到 PDF 文件中吗 换句话说 PDF 文件中的隐写术 有什么算法可以做到这一点吗 有很多方法可以做到这一点 包括
  • 如何用bind来定义apply?

    在 Haskell 中 Applicatives 被认为比 Functor 更强 这意味着我们可以使用 Applicative 来定义 Functor 例如 Functor fmap a gt b gt f a gt f b fmap f