当前位置: 首页 > 知识库问答 >
问题:

阅读器单子能做什么应用函数做不到的?

仇阳州
2023-03-14
f <$> fa <*> fb <*> fc <*> fd $ x
f (fa x) (fb x) (fc x) (fd x)
do
    a <- fa
    b <- fb
    c <- fc
    d <- fd
    return (f a b c d)
    f (fa x) (fb x) (fc x) (fd x)

或者,更准确地说:在我看来,这只是将函数的功能复制为应用程序,但语法更为冗长。

所以,你能给我一个例子,阅读器单子能做的功能,而应用程序不能吗?

实际上,我还想问这两个:应用函数或Reader monad有什么用--因为虽然能够将相同的参数应用到四个函数(fafbfcfd)而不重复这个参数四次,确实减少了一些重复性,但我不确定这种微小的改进是否证明了这种复杂程度是合理的;所以我想我一定是遗漏了一些突出的东西;但这值得另提一个问题

共有1个答案

董品
2023-03-14

monadic版本允许您在对上下文中找到的函数的调用之间添加额外的逻辑,甚至决定根本不调用它们。

do
    a <- fa
    if a == 3 
      then  return (f a 1 1 1)
      else  do
          b <- fb
          c <- fc
          d <- fd
          return (f a b c d)

在原始的do表达式中,确实没有执行applicative实例不能执行的任何操作,事实上,编译器可以确定这一点。如果使用applicativedo扩展名,则

do
    a <- fa
    b <- fb
    c <- fc
    d <- fd
    return (f a b c d)

确实会被降级为f<$>fa<*>fb<*>fc<*>fd,而不是fa>>=\a->fb>>=\b->fc>>=\c->fd>>=\d->return(fa b c d)

这也适用于其他类型,例如

>

  • 可能:

    f <$> (Just 3) <*> (Just 5)
      == Just (f 3 5)
      == do
          x <- Just 3
          y <- Just 5
          return (f 3 5)
    

    []:

    f <$> [1,2] <*> [3,4]
      == [f 1 3, f 1 4, f 2 3, f 2 4]
      == do
          x <- [1,2]
          y <- [3,4]
          return (f x y)
    

  •  类似资料:
    • 问题内容: 据我所知,一个唯一可以做的事和一个不能做的事就是打电话给。 由于我们尚未调用,因此in 会在进入第一遍之前准备状态对象。本质上是相同的: 但是我看到了另一个有用的用例(在服务器端)。 让我们考虑一些异步的东西: 在这里,我们不能使用as分配来不会触发。 怎么样的?根据React docs : 在挂载发生之前立即调用。在之前调用),因此在此方法中设置状态不会触发重新渲染。避免在此方法中引

    • 问题内容: 我想我了解Lisp宏及其在编译阶段的作用。 但是在Python中,您可以将一个函数传递给另一个函数 因此,我们在这里得到了懒惰的评估。我可以使用宏而不是使用函数作为一流对象怎么办? 问题答案: 首先,Lisp也具有一流的功能,因此您也可以问:“如果我已经具有一流的功能,为什么在Lisp中需要宏”。答案是一流的函数不允许您使用语法。 从表面上看,一流的函数允许您编写或,但不允许编写。尽管

    • 问题内容: 在Python中,用于初始化不可变类型,通常用于初始化可变类型。如果将其从语言中删除,该怎么办(轻松)? 例如, 可以这样重写: 为澄清问题的范围:这不是一个问题关于如何以及是使用或它们之间有什么区别。这是一个问题,如果从语言中删除将会发生什么。有什么坏事吗?事情会变得很难或不可能吗? 问题答案: 您可以在中进行的所有操作都可以在中完成。 那么,为什么要使用? 因为您不必将实例存储在变

    • 问题内容: 为什么我们需要特定于数据库的功能,例如mysql_real_escape_string()?addlashes()不能做什么? 暂时忽略了参数化查询的高级替代方案,是一个仅使用addlashes()的web应用仍然容易受到SQL注入的攻击,如果是,怎么办? 问题答案: 当处理多字节编码的字符串时,加号通常不够好。

    • 问题内容: 如果html文件是本地文件(在我的C驱动器上),则可以使用,但是如果html文件在服务器上并且图像文件是本地文件,则无法使用。这是为什么? 任何可能的解决方法? 问题答案: 如果客户端可以请求本地文件系统文件,然后使用JavaScript找出其中的内容,则将是一个安全漏洞。 解决此问题的唯一方法是在浏览器中构建扩展。Firefox扩展和IE扩展可以访问本地资源。Chrome的限制更为严

    • 本文向大家介绍Dubbo能做什么?相关面试题,主要包含被问及Dubbo能做什么?时的应答技巧和注意事项,需要的朋友参考一下 透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何API侵入。 软负载均衡及容错机制,可在内网替代F5等硬件负载均衡器,降低成本,减少单点。 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的IP地址,并且能够平滑添