gpt4 book ai didi

function - 是否有一个函数的名称,该函数接受一段数据和一个函数列表,并将每个函数应用于最后一个函数的结果?

转载 作者:行者123 更新时间:2023-12-02 13:56:51 24 4
gpt4 key购买 nike

Clojure 有一个宏 ->,它接受一段数据和一堆函数,将数据应用到第一个函数,然后将结果应用到下一个函数, 那个的结果到第三个,依此类推,最后给你返回最后一个应用程序的结果。

我非常喜欢这个,因为不必从应用顺序向后编写函数,如下所示:(伪代码如下)

floor (square.root (x))

您可以按照数据流经它们的顺序编写它们:

-> x (square.root, floor)

我的问题是,这个函数在函数式语言中是否有一个标准名称,就像map、reduce和filter有标准名称一样? Clojure 文档将其描述为“通过函数对数据进行线程化”,但我在谷歌搜索“线程”一词时找不到任何内容。我用 Haskell 写了一个简单的版本:

thread :: a -> [(a -> a)] -> a
thread x [] = x
thread x (f:fs) = thread (f x) fs

并在 Hoogle 上搜索了 a -> [(a -> a)] -> a,但也没有找到任何结果。

在研究这个问题时,我还发现您可以使用 Haskell 中的 Control.Arrow 中的函数组合运算符来做非常类似的事情,如下所示:

($2) (sin >>> cos >>> tan)

而使用专用的高阶thread函数,您将编写:

thread 2 [sin, cos, tan]

第一个公式是否足以满足实际使用?

最佳答案

您要查找的名字是function composition .

线程宏和comp之间的区别在于前者利用了Clojure的同像性,而后者更接近组合的数学定义。

事实上,如果您创建一个每步一个参数的函数,并反转函数的顺序,则可以将线程宏调用转换为 comp 调用:

(defn sin [n] (Math/sin n))
(defn cos [n] (Math/cos n))

(-> 1 sin cos sin cos cos) ; 0.6858966217219662
((comp cos cos sin cos sin) 1) ; 0.6858966217219662

关于function - 是否有一个函数的名称,该函数接受一段数据和一个函数列表,并将每个函数应用于最后一个函数的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9545816/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com