lambda演算中λx.λf.fx的名字是什么?
相应的函数在函数式编程语言(例如Haskell)中是否具有标准名称?
在面向对象的编程中,是否存在foo
以函数作为参数并x.foo(f)
返回的方法的常规名称f(x)
?
lambda演算中λx.λf.fx的名字是什么?
相应的函数在函数式编程语言(例如Haskell)中是否具有标准名称?
在面向对象的编程中,是否存在foo
以函数作为参数并x.foo(f)
返回的方法的常规名称f(x)
?
Answers:
在Haskell中,\x.\f.f x
将flip ($)
其$
读为apply,我将其读为反向apply。
大致基于/programming/4090168/is-there-an-inverse-of-the-haskell-operator
\f.\x.\y.f y x
翻转,在这里是C en.wikipedia.org/wiki/B,C,K,W_system
$
这样的翻转功能,期望部分应用的函数会接管2个参数,而您只翻转最后2个参数,因此您将部分应用除2个参数以外的所有参数
(\f.\x.\y.f y x) (\f.\x.f x)
减少到(\x.\f.f x)
模数重命名吗?是的。
在原始的Alonzo Church的“ lambda转换的计算”中,他用T表示该组合器。
在教堂数字的上下文中,它称为exp。这与教会用于术语N到术语M的“应用”的Church的“速记”符号相匹配:“ [[ M N ]”代表“(NM)”。
我还没有听说过类似函数的标准名称。
有时将其称为画眉组合器,在Clojure中将其称为线程优先宏。它的主要用途是允许您按照执行顺序将计算表达为一系列链接的计算。例如,将一个值x
,将其传递给一个函数f
,然后将其结果传递f(x)
给一个函数g
,将被写为g(f(x))
使用标准函数组合(或者g (f x)
使用隐式括号)。当存在大量链接函数时,这可能会很尴尬,因为您必须以相反的顺序阅读它们。如果我们将画眉组合器定义为:
T x f = f x
T x f g ... = T (T x f) g ...
然后,表达式T x f g h
变为h (g (f x))
。
(对于那些寻求更多信息以及使用Racket语言进行具体实现的人,我有一篇有关该主题的博客文章:Thrush组合器)
我希望我能正确理解您的问题,但是我相信这在ML语言中被称为(反向)管道运算符。
[1; 2; 3] |> List.map sq // let it = [1; 4; 9]
还有一个反向管道操作器,可帮助您确定操作顺序。
printf "The value is.." <| 2 + 3 // let it = "The value is..5"
这很有用,因为非管道形式
printf "The value is.." 2 + 3 ;; error
会出错,因为printf会尝试求值"The value is.." 2
并出错,因为没有定义的+
运算符。为了使该工作有效,请使用括号:
printf "The value is.." (2 + 3) // let it = "The value is..5"
对于实际使用来说,|>
运算符非常有用,并且是许多ML和ML启发式语言(如F#,LiveScript和Elixir)的基础。<|
少见,通常仅在增加可读性时使用。