我是Scala的新手(Scala代码运行器版本2.7.7.final),我真的不明白为什么当我们使用高阶函数时它需要调用者提供参数类型.
在下面的示例中,我有一个独立的对象(Util),它有一个函数.但是在Main块中,调用者必须将参数类型传递给匿名函数.
为什么Scala不从Array类型(即String)中推断出函数的类型?有没有办法做到这一点?
object Util {
// Just for fun! Suppose that the arrayOne and arrayTwo are all the same length.
// will swap the elements from arrayOne to ArrayTwo.
def swap[T](arrayOne:Array[T], arrayTwo:Array[T] , f:(T,T) =>(T,T)) {
for(i <- 0 until (arrayOne.length min arrayTwo.length)){
val (left, right) = f(arrayOne(i),arrayTwo(i))
arrayOne(i) = left
arrayTwo(i) = right
}
}
}
object Main extends Application {
val arrayOne = Array("A","B","C")
val arrayTwo = …Run Code Online (Sandbox Code Playgroud) 查看以下HTML/Javascript代码片段:
<html>
<head>
<script type="text/javascript">
var alerts = [];
for(var i = 0; i < 3; i++) {
alerts.push(function() { document.write(i + ', '); });
}
for (var j = 0; j < 3; j++) {
(alerts[j])();
}
for (var i = 0; i < 3; i++) {
(alerts[i])();
}
</script>
</head><body></body></html>
Run Code Online (Sandbox Code Playgroud)
这输出:
3, 3, 3, 0, 1, 2
Run Code Online (Sandbox Code Playgroud)
这不是我所期待的 - 我期待输出 0, 1, 2, 0, 1, 2,
我(错误地)假设被推入数组的匿名函数将表现为闭包,捕获i创建函数时分配的值- 但它实际上表现i为行为全局变量.
任何人都可以解释i这个代码示例的范围内发生了什么,以及为什么匿名函数没有捕获它的值?
我想制作循环按钮组,并向它们添加一些事件,但匿名函数是相同的.我写了示例代码:
for(var i:int=0;i<5;i++)
{
var button:SimpleButton = new SimpleButton(...);
...
button.addEventListener(MouseEvent.CLICK, function(event:MouseEvent):void
{
trace(i);
});
}
...
Run Code Online (Sandbox Code Playgroud)
我想从点击按钮而不是4,4,4,4跟踪0,1,2,3 ..你知道我怎么能做到这一点?
如何在Scala中创建匿名和curried功能?以下两个失败:
scala> (x:Int)(y:Int) => x*y
<console>:1: error: not a legal formal parameter
(x:Int)(y:Int) => x*y
^
scala> ((x:Int)(y:Int)) => x*y
<console>:1: error: not a legal formal parameter
((x:Int)(y:Int)) => x*y
^
Run Code Online (Sandbox Code Playgroud) 为什么以下代码会发出警报2?
var f = (function x(){ return 1; }, function y(){ return 2; })();
alert(f);
Run Code Online (Sandbox Code Playgroud)
我能看到的是,y函数以某种方式被执行并且x函数被忽略.(我已经确定我输入alert了两个函数,并且只调用了alertin y,这让我相信x函数根本没有被调用)
如果我删除该y功能,它会发出警报1.
这是怎么回事?
我是SO的新手,并且每天都在编写和学习一些技术(C#)术语.
谷歌搜索了一段时间后,下面是我研究过的内容 methods
Method是一个语句块,用于代码可重用性,它还支持使用不同的SIGNATURE进行重载....例如:drawShape(2pts),drawShape(3pts)等...
一个Anonymous方法是一个带有语句块的方法,但没有名称....(因为它的提问过早,在wt情况下我们遇到了匿名方法......任何文章,样本......)
Named method:这是一个链接,但最后我没有得到命名方法实际上是...
任何人都可以解释什么是"命名"方法,我们在哪里使用匿名方法?
出于某种原因,当将参数传递给匿名函数时,事件侦听器会为每个元素触发两次.即,元素上的click事件el将注册一次,因此触发一次.
el.addEventListener("click", handle, false);
el.addEventListener("click", handle, false);
Run Code Online (Sandbox Code Playgroud)
但是如果我想将自己的参数传递给它,它将会注册并触发两次.
el.addEventListener("click", function() { handle(event, myArgument); }, false);
el.addEventListener("click", function() { handle(event, myArgument); }, false);
Run Code Online (Sandbox Code Playgroud)
问题是为什么以及解决方案是什么?
我在其他地方寻找,似乎无法找到解决方案或理解为什么会出现这个问题.我尝试在如何将参数传递给addEventListener中传递的侦听器函数中实现解决方案?但他们没有帮助 -
我做了基本的匿名函数或闭包,然后是更高级的版本,如下所示,但确实有效.
我不明白为什么传递没有参数导致元素事件注册一次并传递参数导致元素事件注册两次.
这是代码:
<html>
<head>
<script type="text/javascript">
var handle_2 = function(evt, type) {
var test;
switch (type) {
case "focus":
console.log(evt.target.value);
break;
case "click":
console.log(evt.target.id + " was clicked");
break;
default: console.log("no type found");
}
};
window.onload = function() {
var textbox = document.getElementById("t1");
var button = document.getElementById("btn");
textbox.value …Run Code Online (Sandbox Code Playgroud) javascript events anonymous-function javascript-events addeventlistener
在Kotlin中,可以在其定义中给出lambda参数名称.
fun example(lambda: (a: Int, b: Int) -> Int)
Run Code Online (Sandbox Code Playgroud)
如您所见,a并b在lambda中命名.我认为这对于IDE来说可能是非常有用的信息,生成带有参数名称填充的lambda ...但至少对于IntelliJ,该功能要么不存在,要么以我不知道的方式工作.
那么,命名的lambda参数的用途是什么?他们是否以某种方式改变了编译输出?你有没有可以使用它们的技巧?
我有这样的功能:
class Service {
function delete_user($username) {
...
$sessions = $this->config->sessions;
$this->config->sessions = array_filter($sessions, function($session) use ($this){
return $this->get_username($session->token) != $username;
});
}
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为你不能$this在里面使用use,是否有可能在回调中执行作为类Service成员的函数?或者我需要使用或foreach循环?
鉴于这一系列的Haskell代码,我的任务是将其评估为最简单的形式.
let g h k = (\x -> k (h x)) in g (+1) (\x -> x+x) 20
Run Code Online (Sandbox Code Playgroud)
我已经得到了答案(当然在GHCI中我自己进行了评估): 42
但是,我希望更好地了解评估在这里如何运作.一般来说,我想我知道如何(简单)让表达式工作:
例
a = let y = 5 in y * 5 -- a == 25
Run Code Online (Sandbox Code Playgroud)
该计算结果为25,因为我们绑定y到的价值5和a被分配到的值y*5(后部分in).绑定y = 5仅在范围内有效let.
到目前为止,唯一的解释(至少评估为42)如下:
let g h k = (\x -> k (h x)) in g (+1) (\x -> x+x) 20
Run Code Online (Sandbox Code Playgroud)
g 是 (\x -> k (h x)) …