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

为什么Haskell中的函数组合是对关联的?

雍兴修
2023-03-14

从数学上讲,函数合成操作是关联的。因此:

f . (g . h) = (f . g) . h

因此,可以将函数合成操作定义为左关联或右关联。

由于Haskell中的正常函数应用(即术语的并列,而不是$操作)是关联的,所以我认为函数组合也应该是关联的。毕竟,世界上大多数人(包括我自己)都习惯于从左到右阅读。

infixr 9 .
    null

共有1个答案

西门庆
2023-03-14

在存在非严格评价的情况下,右关联是有用的。让我们看一个非常愚蠢的例子:

foo :: Int -> Int
foo = const 5 . (+3) . (`div` 10)

好的,当.infixr时,该函数的计算值为0时会发生什么?

foo 0
=> (const 5 . ((+3) . (`div` 10))) 0
=> (\x -> const 5 (((+3) . (`div` 10)) x)) 0
=> const 5 (((+3) . (`div` 10)) 0)
=> 5

现在,如果.infixl呢?

foo 0
=> ((const 5 . (+3)) . (`div` 10)) 0
=> (\x -> (const 5 . (+3)) (x `div` 10)) 0
=> (const 5 . (+3)) (0 `div` 10)
=> (\x -> const 5 (x + 3)) (0 `div` 10)
=> const 5 ((0 `div` 10) + 3)
=> 5
 类似资料:
  • 函数组合是将一个函数的输出用作另一个函数的输入的过程。在数学中,合成用表示,其中是一个函数,其输出用作另一个函数(即)的输入。 如果一个函数的输出类型与第二个函数的输入类型匹配,则可以使用这两个函数来实现函数组合。我们使用点运算符()在Haskell中实现函数组合。 看下面的示例代码。演示如何使用函数组合来计算输入数字是偶数还是奇数。 在这里,在函数中,同时调用了两个函数和。编译器将首先以作为参数

  • ; ; ; 在2.中,设3。;因此,应为,,替换为1。,为,应为 但是,应该彼此相等,?如何使两者在GHCi中相互适应,它似乎用或代替了,那么它是如何前进的呢?

  • 问题内容: 我相信Erlang社区不会羡慕Node.js,因为它本身就进行非阻塞I / O并具有将部署轻松扩展到一个以上处理器(Node.js甚至没有内置的功能)的方法。有关更多详细信息,请访问http://journal.dedasys.com/2010/04/29/erlang- vs-node-js 和Node.js或Erlang 那Haskell呢?Haskell是否可以提供Node.js

  • 在JavaScript中,该代码如下所示: 正如您所看到的,函数组合与JavaScript中的链接方法非常相似。我真的很喜欢链接方法从左到右读取的方式。在Haskell中,我可以使用中的函数和反向函数应用程序执行类似的操作,如下所示: 现在我想用点自由样式来写这个函数。使用函数组合,我将把它写如下: 函数组合的美妙之处在于它可以与自身组合,形成如上所示的“高阶函数组合”。因此,尽管它的类型签名直观

  • 本文向大家介绍php通过array_merge()函数合并关联和非关联数组的方法,包括了php通过array_merge()函数合并关联和非关联数组的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php通过array_merge()函数合并关联和非关联数组的方法。分享给大家供大家参考。具体分析如下: array_merge()是一个用于合并数组的php函数,后一个数组追加到前一个的结