- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在努力解决 scala 延续的复杂打字问题。我一直在阅读我能找到的所有 Material ,包括关于 continuations 包的引用文档。我想我已经在某种程度上弄清楚了,当你考虑它时它是有道理的。
我认为我对它的理解(以及我的一些问题)可以通过这个程序得到最好的总结:
package com.whatever;
import scala.util.continuations._;
object methods {
/* The method takes an Int as its parameter. Theoretically, at some point in the future,
* it will return a Float to the remainder of the continuation. This example does it
* immediately but doesn't have to (for example it could be calling a network service
* to do the transformation)
*
* Float @cpsParam[Unit,Float] means that whatever part of the reset{} that is captured
* as a closure should receive a Float and needn't return anything (would it be meaningful
* if Unit were something else?)
*
* The reason I have to return 0.toFloat is so the compiler can properly type the
* method. That zero will never go anywhere. Is this a sign I'm doing it wrong?
*/
def method1(param:Int): Float @cpsParam[Unit,Float] = shift { cb:(Float=>Unit) =>
cb(param.toFloat);
0.toFloat;
}
/* This method is basically identical but returns a String instead of a Float (Again,
* theoretically this would be done by a network service and cb would be called at some
* point in the future.
*/
def method2(param:Int): String @cpsParam[Unit,String] = shift { cb:(String=>Unit) =>
cb(param.toString);
""
}
}
object Main {
def main(args:Array[String]):Unit = {
reset {
val f = methods.method1(5);
println(f);
}
}
}
Unit
如 B
在 @cpsParam[B,C]
? "5.0"
)。但是,我现在遇到的导致我困惑的问题是当我更改 reset
时阻止尝试拨打 method2
之后 method1
:reset {
val f = methods.method1(5);
println(f);
val s = methods.method2(42);
println(s);
}
illegal answer type modification: scala.util.continuations.cpsParam[Unit,Float] andThen scala.util.continuations.cpsParam[Unit,String]
最佳答案
在我问了这个问题之后,我做了更多的研究,我想我现在可以回答我自己的问题了(我希望这不是失礼)。
我做了三件事帮助我理解了这个问题,我认为任何在 Scala 的延续方面遇到问题的人都可以很好地遵循以下步骤:
shift
的类型签名并注意它在做什么。这将把你带到我的顿悟。 @cpsParam
s 和
cb
shift
的参数都错了。我将解释我如何找出我做错了什么,以便其他像我一样愚蠢的人可以遵循相同的步骤,并希望在延续编译器让他们发疯时获得一些见解。
reset
以回调传递风格阻止,假装它不是
shift
,每个方法都有一个名为
cb
的第二个参数这将需要一个函数来完成块的其余部分。这是重置块之后的样子:
methods.method1(5, {f: Int => {
println(f);
methods.method2(42, {s: String => {
println(s);
});
});
Unit
否则它们会污染它们被传入的方法的返回类型。我认为这就是编译器试图告诉我的(尽管我可能是错的)。
method1
必须看起来像我的回调式程序
def method1(param:Int, cb:(Float=>Unit)):Unit = {
cb(param.toFloat);
}
method2
是相似的,但需要一个
(String=>Unit)
.现在很明显我的方法也应该返回
Unit
否则它们可能会污染回调函数的返回类型。
shift
只捕获到下一个
shift
作为延续。当然,事实并非如此。每个
shift
必须捕获
reset
的全部其余部分块包括以下所有
shift
s 以便它形成一个大的嵌套回调中的回调情况。此外,所有回调和所有 CPS 调用的方法应该总是(据我所知)返回
Unit
,因为它们的结果不仅不会做任何事情,而且可能会污染调用它们的函数的返回类型,等等。
shift
的签名.它就在我面前:
def shift[A,B,C](fun: (A => B) => C)): A @cpsParam[B,C]
shift
在幕后做了什么)基本上可以把它变成一个维度分析的练习。
method1
的结果将是
Float
.因此,继续回调(在上面表示为
(A => B)
)需要接受
Float
作为其参数。这修复了
A
如
Float
.因此
method1
现在看起来像这样:
def method1(param:Int): Float @cpsParam[B,C] = shift { cb: (Float => B) => {
...
C
}
}
shift
的函数必须将一个函数从 Float 带到 B,然后返回 C。好吧,我从我的练习中知道回调应该返回 Unit 否则事情会变得困惑。我也知道在我的回调练习中,方法本身显然应该返回
Unit
因为他们将实际结果作为参数传递给延续。这类似于 C 也是单位。所以这意味着
method1
必须是这样的:
def method1(param:Int): Float @cpsParam[Unit,Unit] = shift { cb: (Float => Unit) => {
cb(param);
}
}
method2
除了回调将采用字符串之外,将是相同的。
Unit
因为任何结果都作为参数传递而不是返回。
B
没有太大的意义。和
C
在
shift
不是
Unit
.这是完全合理的,因为有一个注释
@suspendable
这是
@cps[Unit]
的快捷方式这是
@cpsParam[Unit,Unit]
的快捷方式.
MyReturnType @suspendable
以外的任何东西,那么你可能做错了,顺便说一句,
shift
所采用的函数参数也应该返回
Unit
。”那样的话,我还有生命中最后几天宝贵的时光。
关于Scala 延续 : many shifts in sequence,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9487051/
我正在尝试实现 Intellij 之类的双类导航。我发现它被称为“快速打开文件”的“序列键绑定(bind)”。 因此,我在 .sublime-keymap --- USER 中添加了这一行 { "
this.x = (Math.random()*canvasWidth); this.y = (Math.random()*canvasHeight); (1) this.shift = {x: th
我目前正在研究编译器,据我了解,在 LR(0) 中,有时会出现“shift/reduce”或“reduce/reduce”冲突,但不可能出现“shift/shift”冲突!为什么我们不能发生“转变/转
我希望使用 AutoHotKey 来修改我的 shift 键的功能。 Steve Losh 的博客条目 here 中描述了该功能。 .具体来说,我希望我的 shift 键执行以下操作: 如果 LShi
在我的Redis数据库中,我有一个以prefix:格式保存的键列表,所以示例数据库看起来像这样:。问题是,当我尝试删除前缀:1时,因为无论出于什么原因,我都需要删除IPSUM,在索引之间留下了一个间隙
在我的Redis DB中,我有一个以prefix:格式保存的键列表,因此示例数据库如下所示:。问题是,当我尝试删除前缀:1时,因为无论出于什么原因,我都需要删除IPSUM,在索引之间留下了一个间隙--
Listview 控件中是否有可以上下移动项目的功能? 最佳答案 我没有太多使用 TListView(我主要使用数据库网格),我把你的问题作为学习一些东西的机会。下面的代码是结果,它比大卫的答案更直观
我有点难以发现这两种操作的不同之处。所以我读到算术移位与逻辑移位基本相同,唯一的区别是它以某种方式保持最高位或有符号位。 所以当我在 101110 上做 LSL #2 时假设这个二进制是一个无符号的,
我正在尝试使用 shift+shift 配置键映射,这可能吗? 我试过: But this maps shift + S and this that maps to unknown 最佳答案 您不
我正在努力在 vim 中绑定(bind) Shift+- 组合。我已经尝试了以下两种选项,但都没有可用的选项,并且谷歌搜索没有带来任何相关信息。 nnoremap - nnoremap - 我正在
我正在使用基于Gallery 的Cover-flow,正如建议的那样here . 是否有可以捕获的事件表明在我的画廊/封面流中进行了一次移位(向左或向右)? 需要明确的是,如果我给画廊一个像样的滑动并
这个问题在这里已经有了答案: Cocoa - NSEvent Respond to the SHIFT key? (5 个答案) 关闭 3 年前。 我正在制作这个应用程序,我想检测是否检测到 shi
我不允许在我的 C 代码中使用浮点变量(出于性能原因)。我想进行整数除法运算,同时我想尽可能地防止除法损失。 我的理解是,如果分子很大,除法运算会产生很好的结果。目前我正在对分子进行左移操作以使其成为
我有一个文本输入,当用户按下 shift(keydown)并绑定(bind)一个监听器以监听 shift 键时,它现在变得透明 即。 $('#foo').keydown(function(){
我有一个包含 shift 命令的 bash 脚本。 它在 bash 中运行正常,但在 zsh 环境中,shift 命令似乎不同。 zsh $ shift shift: shift count must
我正在使用 Fedora 29 中包含的 vim: VIM - Vi IMproved 8.1(2018 年 5 月 18 日,2019 年 2 月 4 日 14:19:12 编译) 我刚刚注意到按
我有一个包含 shift 命令的 bash 脚本。 它在 bash 中运行正常,但在 zsh 环境中,shift 命令似乎不同。 zsh $ shift shift: shift count must
我正在使用 Fedora 29 中包含的 vim: VIM - Vi IMproved 8.1(2018 年 5 月 18 日,2019 年 2 月 4 日 14:19:12 编译) 我刚刚注意到按
我可以使用 UITextViewDelegate 或 NSNotificationCenter 来检测用户何时点击 Keyboard 上的字符键将文本输入到 UITextView. 但我的应用程序需要
当我尝试单击 shift + tab 组合时, Shiftkey 被触发 $("#buttonZZ").on("keydown",function (eve) { if (eve.keyCod
我是一名优秀的程序员,十分优秀!