Clojure的具有宏->
,这需要一个数据片和一组函数,所述数据适用于第一功能,然后应用的,为下一个,的结果的结果的是到第三个,等,最后给你回到最后一个申请的结果.
我非常喜欢这个,因为它不必从应用它们的顺序向后编写函数,如下所示:(伪代码跟随)
floor (square.root (x))
Run Code Online (Sandbox Code Playgroud)
您可以按照数据流经它们的顺序编写它们:
-> x (square.root, floor)
Run Code Online (Sandbox Code Playgroud)
我的问题是,在函数式语言中是否有这个函数的标准名称,map,reduce和filter有标准名称吗?Clojure文档将其描述为"通过函数线程化数据",但我在谷歌上找不到任何东西thread
.我在Haskell中写了一个简单的版本:
thread :: a -> [(a -> a)] -> a
thread x [] = x
thread x (f:fs) = thread (f x) fs
Run Code Online (Sandbox Code Playgroud)
并a -> [(a -> a)] -> a
在Hoogle上搜索,但也没有找到任何东西.
在研究这个问题时,我还发现你可以使用Control.Arrow
Haskell中的函数组合运算符做一个非常类似的事情,如下所示:
($2) (sin >>> cos >>> tan)
Run Code Online (Sandbox Code Playgroud)
而使用专用的高阶thread
函数,你会写:
thread 2 [sin, cos, tan]
Run Code Online (Sandbox Code Playgroud)
是否第一种配方足以满足实际用途?
想象一下,你有一个包含行,列和层的三维数组:
A <- array (1:27, c(3,3,3))
Run Code Online (Sandbox Code Playgroud)
并且假设你有一个函数将矩阵作为输入并返回矩阵作为输出,如t
.
如何将该函数应用于数组的每一层,返回与第一层相同大小的另一个数组?
我觉得我应该能够以apply
某种方式做到这一点,但我做不到.
奖金问题(如果你回答这个问题,我将非常感激):这样做是否更快,或者为每个层矩阵和lapply
函数制作一个列表?
-
编辑:请不要认为这个问题得到了回答 - 下面的答案没有回答这个问题.
我想使用Haskell进行随机模拟,但我不知道如何.我读过Hutton的"Haskell编程",我很乐意编写确定性函数程序.但是,我不知道如何开始编写R或python等命令式语言中易于使用的随机模拟.是否有关于此的教程或入门,我可以阅读,或者任何人都可以提供一些入门提示?
请原谅我缺乏适当的术语 - 我对--morphisms等一无所知,但我觉得我试图表达的概念可以通过某种术语来描述.
映射,缩小和过滤,经典的高阶函数,都具有获取函数f
和数据列表xs
以及f
对所有数据执行某些操作的一般结构xs
.现在,他们每个人,我能想象一个"functionised"版本- mapf给他们打电话,reducef和filterf -这不是需要一个数据块x
和功能的列表fs
并执行每个功能fs
的数据x
.具体来说,mapf会返回一个列表f1(x), f2(x), ...
,reducef会给你f3 (f2 (f1 (x)))
或者f1 (f2 (f3 (x)))
(取决于它是左还是右),filterf会测试每个是否f1(x), f2(x), ...
为真,只返回fs
那些.
我的问题是:是否可以编写一个通用函数,functionise
它将map,reduce或filter作为参数并生成相应的mapf,reducef或filterf函数?(当然,优雅的方式不仅仅是一系列的案例表达.)
我不介意使用什么编程语言; 在我自己的实验中,我一直在使用Haskell,而导致我这个问题的原因是我注意到所有三个函数都可以用非常类似的方式定义:
rev = \x y -> y x
mapf :: a -> [a -> b] -> [b]
mapf x fs = map (rev x) fs
reducef :: a -> [a -> a] …
Run Code Online (Sandbox Code Playgroud)