这个Lambda函数返回1:
(\x y -> 1) 1 p
Run Code Online (Sandbox Code Playgroud)
其中p =(\ xy - > 1)
好吧,这对我来说很有意义 - Lambda函数返回1,与其参数无关.
现在,这个Lambda函数生成一个错误(无限类型错误):
(\x y -> x y x) p 1
Run Code Online (Sandbox Code Playgroud)
这对我来说没有意义.如果该函数应用于这里的参数是将p替换为x而将1替换为y的结果:
p 1 p
Run Code Online (Sandbox Code Playgroud)
将第一个p替换为其定义:
(\x y -> 1) 1 p
Run Code Online (Sandbox Code Playgroud)
嘿! 这与上面的相同,返回1.
问题:为什么(\ xy - > 1)1 p成功而(\ xy - > xyx)p 1失败?
/罗杰
我将一组匿名函数分组到一个结构中,并将该结构中的一些变量分组.有没有办法引用"自我",即自己的结构?我想要完成的是让函数根据成员变量返回一些值.为简单起见,说我有struct 一个,在哪里
a.value_1 = 3;
a.value_2 = 2;
a.sum = @()(self.value_1 + self.value_2)
Run Code Online (Sandbox Code Playgroud)
在MATLAB中有类似的东西吗?
我偶然发现了这个技巧,从匿名内部类中获取一个值,该变量在外部类中声明.它有效,但感觉就像一个肮脏的黑客:
private int showDialog()
{
final int[] myValue = new int[1];
JPanel panel = new JPanel();
final JDialog dialog = new JDialog(mainWindow, "Hit the button", true);
dialog.setDefaultCloseOperation( WindowConstants.DO_NOTHING_ON_CLOSE );
JButton button = new JButton("Hit me!");
button.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
myValue[0] = 42;
dialog.setVisible(false);
}
});
panel.add(button);
dialog.add(panel);
dialog.pack();
dialog.setVisible(true);
return myValue[0];
}
Run Code Online (Sandbox Code Playgroud)
(是的,我意识到这个例子可以用一个简单的替换JOptionPane,但我的实际对话框要复杂得多.)内部函数坚持认为它与之交互的所有变量都是final,但我不能将其声明myValue为final,因为内部函数需要为其分配一个值.将它声明为1元素阵列解决了这个问题,但似乎它可能是某种坏事TM.我想知道是否a.)这是常见做法或b.)这可能导致任何严重问题.
我想将我的代码分发为一个自我唤起的匿名函数,正如我看到许多人所做的那样.此外,在我的代码中,我必须监视另一个lib加载,所以我可以在它可用时使用它.
(function(window, document, undefined) {
staffHappens();
var initMyLib = function() {
if (typeof(myLib) == 'undefined') {
setTimeout("initMyLib()", 50);
} else {
useMyLib();
}
}
moreStaffHappens();
initMyLib(); //-> initMyLib is undefined
})(this, document);
Run Code Online (Sandbox Code Playgroud)
这个错误怎么会发生?initMyLib应该在封闭(自我调用)函数的范围内吗?
可能重复:
立即执行匿名函数
我想立即评估一个匿名函数,而不是它在方法args中作为Closure对象出现.这可能吗?
例如:
$obj = MyClass;
$obj->Foo(function(){return "bar";}); // passes a Closure into Foo()
$obj->Foo(function(){return "bar";}()); // passes the string "bar" into Foo()?
Run Code Online (Sandbox Code Playgroud)
第3行是非法语法 - 有没有办法做到这一点?
谢谢
匿名函数和普通函数之间的性能会有差异吗?例如,函数调用的开销是否有任何变化?
感谢致敬!
我正面临一个问题,试图在Expression <Func <MyType,bool >>类型的LambdaExpression上调用Compile(),其深度大约为400.较小的值不会导致任何问题.我找不到任何关于这种限制的事情.任何人都可以澄清这个吗?我可以增加这个限额吗?
upd:对不起,忘了提,我得到StackOverflowException:
System.Core.dll中出现未处理的"System.StackOverflowException"类型异常{无法计算表达式,因为当前线程处于堆栈溢出状态.}
我以前从未在PHP中使用过匿名函数,但是我发现了一段代码,它使用一个代码来排序对象
usort($numTurnsPerUser,build_sorter('turns'));
function build_sorter($key) {
return function ($a, $b) use ($key) {
return strnatcmp($a[$key], $b[$key]);
};
}
Run Code Online (Sandbox Code Playgroud)
此代码将通过键对对象进行排序(我传入"turn").例如,一个看起来像这样的对象:(用JSON编写,只是为了便于阅读)
$numTurnsPerUser = {
"31":{
"turns":15,
"order":0
}, "36":{
"turns":12,
"order":1
}, "37":{
"turns":14,
"order":2
}
}
Run Code Online (Sandbox Code Playgroud)
将被分类为如下所示的对象:
$numTurnsPerUser = {
"36":{
"turns":12,
"order":1
}, "37":{
"turns":14,
"order":2
}, "31":{
"turns":15,
"order":0
}
}
Run Code Online (Sandbox Code Playgroud)
这在我的运行PHP 5.3.0的本地服务器上运行良好,但它无法在我的在线服务器上运行,运行"php5" - 我无法找到除此之外的任何信息.我收到了一个错误
解析错误:语法错误,意外T_FUNCTION
我读到PHP <5.3不能使用匿名函数,必须使用create_function,但匿名函数的"use"部分让我难以理解.有人可以向我解释一下该功能的"使用"部分是什么,或者更好的是,我如何将其"翻译"到所需的create_function参数?
我有两个列表:L和E.我尝试编写一个函数,它返回另一个列表,其中包含L中元素的出现次数.
-module(mymodule).
-export([count/2]).
-export([numberOfOccurences/2]).
count([Head|Tail], Counter) ->
fun(Element) -> if
[Head|Tail] == [] -> Counter;
Element == Head -> count(Tail, Counter + 1);
Element /= Head -> count(Tail, Counter)
end
end.
numberOfOccurences(L, E) ->
lists:map(count(L, 0), E).
Run Code Online (Sandbox Code Playgroud)
mymodule:numberOfOccurences[1,2,"abc",2,1,"abc",4,1,1], [1,2,3,"abc"])应该回来[4,2,0,2].但它返回一个包含4个函数的列表.我究竟做错了什么?
erlang closures functional-programming list anonymous-function
我注意到在Julia中使用匿名函数会导致性能下降.为了说明我有两个quicksort实现(取自Julia发行版中的微观性能基准).第一种按升序排序
function qsort!(a,lo,hi)
i, j = lo, hi
while i < hi
pivot = a[(lo+hi)>>>1]
while i <= j
while a[i] < pivot; i += 1; end
while pivot < a[j]; j -= 1; end
if i <= j
a[i], a[j] = a[j], a[i]
i, j = i+1, j-1
end
end
if lo < j; qsort!(a,lo,j); end
lo, j = i, hi
end
return a
end
Run Code Online (Sandbox Code Playgroud)
第二个需要一个额外的参数:一个匿名函数,可用于指定升序或降序排序,或比较更奇特的类型
function qsort_generic!(a,lo,hi,op=(x,y)->x<y)
i, j = lo, hi
while i < hi
pivot = …Run Code Online (Sandbox Code Playgroud)