- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我们有 g :: a -> b
,和f :: b -> c
。我们可以这样写:
f . g :: a -> c
.如果我们的函数返回一元值(即上下文中的值),例如 g1 :: (Monad m) => a -> m b
和f1 :: (Monad m) => b -> m c
。我们可以这样写:
f1 <=< g1 :: (Monad m) => a -> m c
.return x >>= g1 >>= f1
,其中x :: a
,以获得一个值。甚至是 lambda \x -> return x >>= g1 >>= f1
.看来<=<
与 .
更平行在语法方面。 <=<
更容易理解Monad
只是关于保留上下文的函数组合。为什么是>>=
比<=<
更常被谈论?
最佳答案
<=<
是解释 monad laws 的好方法。 :
f <=< return = f -- right identity
return <=< g = g -- left identity
f <=< (g <=< h) = (f <=< g) <=< h -- associativity
它对于演示 Kleisli 箭头的类别非常有用:
newtype Kleisli m a b = Kleisli { runKleisli :: a -> m b }
instance Monad m => Category (Kleisli m) where
Kleisli f . Kleisli g = Kleisli (f <=< g)
id = Kleisli return
您会看到它出现在无积分程序中。就我个人而言,我也很喜欢它的同行=<<
.
虽然它使谈论单子(monad)定律和组合变得更容易,但我认为仍然有一些强有力的说教原因 >>=
在 monad 教程和 Haskell 介绍中是首选。
第一个原因是<=<
的强项是无点代码,对于来自 C 语法系列语言(C、C++、Java、Python 等)的人来说,大多数情况下,无点代码一开始更难理解。
如果“point-free”对您来说是一个陌生的形容词,那么这里有同一函数的三个实现:
f a b = a + b * 2
f a = (a +) . (* 2)
f = flip (.) (*2) . (+)
它们都运行相同的计算,但最后一个采用所谓的“无点”风格,其中左侧的变量已通过 eta conversion 删除。 。
这个例子很像一个稻草人,但无点风格很诱人,很容易导致初学者很难理解的代码。
另一个原因是初学者几乎都会问的问题之一是“如何打开 IO String
以获得 String
?”当第一次遇到 haskell 的IO
单子(monad)。答案当然是,“你不这样做,你把其余的链起来>>=
的计算", >>=
更容易解释这种关系之间
putStrLn "Your first name: " >>= \_ ->
getLine >>= \first ->
putStrLn "Your last name: " >>= \_ ->
getLine >>= \last ->
putStrLn ("Hello " ++ first ++ " " ++ last)
和
do
putStrLn "Your first name: "
first <- getLine
putStrLn "Your last name: "
last <- getLine
putStrLn ("Hello " ++ first ++ " " ++ last)
当然,最后一个原因是 >>=
位于 Monad
的定义中, 和 <=<
不是,这就是语言的定义方式。人们是当以下情况时,更有可能谈论类型类成员而不是任意函数向其他人传授有关类型类的知识,尤其是当老师对于该主题本身来说相对较新(正如许多 monad 教程作者一样)。
关于haskell - 为什么>>=比<=<更常被讨论?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45513040/
问题:您好,我已经为我的一个客户创建了一个 DBMS,其中有一个功能,即从相同的表单输入将值拆分为四个不同的表(但是)有时会发生值输入到 table1 和 table2 而不是 table3 和 ta
我正在开发基于 Web 的应用程序,该应用程序需要在将任何文件上传到服务器之前检查其大小。 如果 Web 开发人员可以通过任何方式在客户端检查文件大小而不是在服务器端检查文件大小,从而避免不必要的服务
Closed. This question is opinion-based。它当前不接受答案。 想改善这个问题吗?更新问题,以便editing this post用事实和引用来回答。 5年前关闭。
好的,这个线程将更像是对标题中提到的主题的讨论。我一遍又一遍地搜索整个主题,但没有找到适合我的好/可接受的解决方案。 场景 假设我有一个 android 项目,我需要一个第三方库(例如 drag-so
我正在进行的项目使用用户创建的多个“墙”进行讨论。 我的问题涉及如何在 MySQL 数据库中对此进行建模。 拥有一个名为“walls”的表,其中包含诸如创建者等信息,以及另一个名为“messages”
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit th
发现了一个有趣的问题,我首先在 WinForms 中发现,然后在 Silverlight 中再次发现,而且在数据绑定(bind)方面也很可能是 WPF。 我有一个带有多个选项卡的选项卡控件。当用户点击
我正在用 VBA 编写一个方法,但我收到了 ByRef 参数类型不匹配。在做了一些研究之后,我找到了一个快速的解决方法——将我的值存储在另一个变量中,然后将该新变量传递给我的方法。谁能向我解释疯狂背后
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 7 年前。 Improv
我一直在尝试修改 Odoo 讨论,但没有成功。 这就是我要实现的目标: 我将带有“新消息”按钮的消息添加到 Odoo 模块(在类 mro.order 中)。消息显示在讨论模块中: 但我需要标题类似于“
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
为任何错误的术语道歉——我对计算机科学很陌生,我几乎只知道 Clojure(但我想我会说我很了解它)。 所以,我没有对此进行大量研究,但有时我发现在编写 Clojure 代码时它很有用,以便能够从该数
a) 匿名卷 使用数据容器时,您可以像这样使用匿名卷 version '2' services: consumer: volume_from: - data-container
var yourObjects = [ { object: {obj1:"aa"}, direction: 'top' }, { object: "obj2", direction: 'left' }
我正在尝试使用 Disqus API 将帖子添加到现有的讨论/论坛。在文档中我可以读到我可以作为访客发送评论而无需身份验证。文档是这样说的: http://disqus.com/api/docs/po
因此,我偶然发现了一本名为“C++科学计算指南”的C++书的练习。 这是练习: “编写代码,为三个2×2矩阵的 double 浮点数A,B,C动态分配内存,并为A和B的条目分配值。令C = A +B。
规则 CA1008指定所有枚举都应具有 0 值,该值应命名为 Unknown(我们不在此处讨论标志)。我理解您想防止未初始化的值自动获得意义的原因。假设我定义了以下枚举: enum Gender {
前几天,Google 通知我,我的 Gmail 帐户可能已被盗用,因为它已被两个来自异常位置的 IP 地址访问。由于我通常(并且愚蠢地)为每个网站使用相同的密码,所以我决定改变一下并使用不同的密码。
RubyGems.org ,官方 gems 站点,提供的功能很差。我想为我的网站找到一些好的 gems,但这是不可能的——它只提供了几个“新 Gems”/“今天下载最多的” gems,以及所有的列表
我如何提取我博客中的最新对话(整个网站)并显示最近的 10 条评论作为来自 Disqus 的对话摘要? 最佳答案 您可以使用 Disqus 论坛/listPosts API 方法构建一个最新评论小部件
我是一名优秀的程序员,十分优秀!