- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
你好:我最近一直在学习 Scala(我的相关背景主要是 C++ 模板),我遇到了一些我目前对 Scala 不了解的东西,这让我发疯了。 :(
(另外,这是我在 StackOverflow 上的第一篇文章,我注意到大多数非常棒的 Scala 人似乎都在闲逛,所以如果我对机制做了一些非常愚蠢的事情,我真的很抱歉。)
我的具体困惑与隐式参数绑定(bind)有关:我提出了一个特定情况,即隐式参数拒绝绑定(bind),但具有看似相同语义的函数却可以。
现在,它当然可能是编译器错误,但鉴于我刚刚开始使用 Scala,我已经遇到某种严重错误的可能性非常小,我期待有人解释我的问题做错了。 ;P
我已经浏览了代码并对其进行了相当多的修改,以便提出一个不起作用的示例。不幸的是,这个例子仍然相当复杂,因为这个问题似乎只出现在泛化中。 :(
1) 没有按我预期的方式工作的简化代码
import HList.::
trait HApplyOps {
implicit def runNil
(input :HNil)
(context :Object)
:HNil
= {
HNil()
}
implicit def runAll[Input <:HList, Output <:HList]
(input :Int::Input)
(context :Object)
(implicit run :Input=>Object=>Output)
:Int::Output
= {
HCons(0, run(input.tail)(context))
}
def runAny[Input <:HList, Output <:HList]
(input :Input)
(context :Object)
(implicit run :Input=>Object=>Output)
:Output
= {
run(input)(context)
}
}
sealed trait HList
final case class HCons[Head, Tail <:HList]
(head :Head, tail :Tail)
extends HList
{
def ::[Value](value :Value) = HCons(value, this)
}
final case class HNil()
extends HList
{
def ::[Value](value :Value) = HCons(value, this)
}
object HList extends HApplyOps {
type ::[Head, Tail <:HList] = HCons[Head, Tail]
}
class Test {
def main(args :Array[String]) {
HList.runAny( HNil())(null) // yay! ;P
HList.runAny(0::HNil())(null) // fail :(
}
}
这段代码用 Scala 2.9.0.1 编译,返回以下错误:
broken1.scala:53: error: No implicit view available from HCons[Int,HNil] => (java.lang.Object) => Output.
HList.runAny(0::HNil())(null)
在这种情况下,我的期望是 runAll
将绑定(bind)到 runAny
的隐式 run
参数。
现在,如果我修改 runAll
使其不是直接获取它的两个参数,而是返回一个函数,该函数又接受这两个参数(我想尝试的技巧,因为我看到它在别人的代码中),它可以工作:
2) 修改后的代码具有相同的运行时行为并实际运行
implicit def runAll[Input <:HList, Output <:HList]
(implicit run :Input=>Object=>Output)
:Int::Input=>Object=>Int::Output
= {
input =>
context =>
HCons(0, run(input.tail)(context))
}
本质上,我的问题是:为什么会这样? ;( 我希望这两个函数具有相同的整体类型签名:
1: [Input <:HList, Output <:HList] (Int::Input)(Object):Int::Output
2: [Input <:Hlist, Output <:HList] :Int::Input=>Object=>Int::Output
如果它有助于理解问题,其他一些改变也“起作用”(尽管这些改变了函数的语义,因此不是可用的解决方案):
3) 通过将 Output 替换为 HNil
,仅对第二级硬编码runAll
implicit def runAll[Input <:HList, Output <:HList]
(input :Int::Input)
(context :Object)
(implicit run :Input=>Object=>HNil)
:Int::HNil
= {
HCons(0, run(input.tail)(context))
}
4) 从隐式函数中移除上下文参数
trait HApplyOps {
implicit def runNil
(input :HNil)
:HNil
= {
HNil()
}
implicit def runAll[Input <:HList, Output <:HList]
(input :Int::Input)
(implicit run :Input=>Output)
:Int::Output
= {
HCons(0, run(input.tail))
}
def runAny[Input <:HList, Output <:HList]
(input :Input)
(context :Object)
(implicit run :Input=>Output)
:Output
= {
run(input)
}
}
任何人对此可能有的解释将不胜感激。 :(
(目前,我最好的猜测是隐式参数相对于其他参数的顺序是我遗漏的关键因素,但我对此感到困惑:runAny
最后也有一个隐式参数,所以明显的“implicit def
不能很好地与尾随implicit
一起工作”对我来说没有意义。)
最佳答案
当您像这样声明 隐式 def
时:
implicit def makeStr(i: Int): String = i.toString
然后编译器可以根据这个定义自动为您创建一个隐式 Function
对象,并将其插入到需要隐式 Int => String
类型的位置。这就是您的 HList.runAny(HNil())(null)
行中发生的情况。
但是当你定义 implicit def
s 自己接受隐式参数(如你的 runAll
方法)时,它不再起作用,因为编译器无法创建Function
对象,其 apply
方法需要一个隐式 - 更不用说保证调用站点可以使用这种隐式了。
解决方案是定义类似这样的东西而不是 runAll
:
implicit def runAllFct[Input <: HList, Output <: HList]
(implicit run: Input => Object => Output):
Int :: Input => Object => Int :: Output =
{ input: Int :: Input =>
context: Object =>
HCons(0, run(input.tail)(context))
}
这个定义更明确一点,因为编译器现在不需要尝试从你的 def
创建一个 Function
对象,而是直接调用你的def
来获取需要的函数对象。并且,在调用它时,会自动插入所需的隐式参数,它可以立即解析。
在我看来,每当您期望这种类型的隐式函数时,您都应该提供一个确实返回 Function
对象的 implicit def
。 (其他用户可能不同意……任何人?)编译器能够围绕 implicit def
创建 Function
包装器的事实主要是为了支持隐式转换更自然的语法,例如使用 view bounds连同简单的 implicit def
s,比如我的第一个 Int
到 String
的转换。
关于scala - 两个看似相同的语义 : one binds implicitly, 另一个没有,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6173815/
我不知道该怎么做... function f1() { var x = 10; function f2(fx) { var x; x = 6;
早期绑定(bind)和后期绑定(bind)有什么区别? 最佳答案 简短的回答是,早期(或静态)绑定(bind)是指编译时绑定(bind),后期(或动态)绑定(bind)是指运行时绑定(bind)(例如
如何在 SwiftUI View 上使用 Binding(get: { }, set: { }) 自定义绑定(bind)与 @Binding 属性。我已成功使用此自定义绑定(bind)与 @State
我经常发现自己遇到问题,即控件的两个(相关)值被更新,并且两者都会触发昂贵的操作,或者控件可能会暂时处于不一致的状态。 例如,考虑一个数据绑定(bind),其中两个值 (x,y) 相互减去,最终结果用
我想通过我的 ViewModel 控制我的一个窗口的高度和宽度。 这看起来很简单。 但没有。它不起作用。 它检查 ViewModel 的 Width但不是 Height . 奇怪的是,如果我切换 W
UI5中一次性绑定(bind)和单向绑定(bind)有什么区别? 是否有任何用户特定的用例我会使用它们? 我无法从文档中获得太多信息。 最佳答案 单程 它的作用:单向数据流。模型数据的变化(例如通过
(define make (lambda (x) (lambda (y) (cons x (list y))))) (let ((x 7) (p (make 4))) (cons
尽管我或多或少地了解什么是语言绑定(bind),但我很难理解它们是如何工作的。 例如,谁能解释一下如何为 WinAPI 制作 Java 绑定(bind)? 最佳答案 如果您搜索 Foreign Fun
谁能解释为什么我可以重新绑定(bind)列表但不能+? (binding [list vector] (list 1 3)) (binding [list +] (list 1 3)) (bi
我真的很喜欢 Caliburn 和命名约定绑定(bind),我很惊讶 可见性与“CanNAME”约定用于保护 Action 的方式不同。 据我所知, BooleanToVisibilityConver
我了解动态绑定(bind)的实现方式以及静态绑定(bind)和动态绑定(bind)之间的区别,但我只是无法理解动态绑定(bind)的定义。基本上它是一种运行时绑定(bind)类型。 最佳答案 基本上,
http://jsfiddle.net/3NRsd/ var foo = $("div").bind("click", function() { $("div").animate({"hei
这个问题我快疯了...我有一个用户控件,它有一个用于插入操作的 FormView 和一个用于所有其他操作的 GridView。 在这两个控件中,我都有一个 DropDownList,如下所示: '
我有一个绑定(bind)到 ListBox 的地址的 ObservableCollection。然后在 ItemTemplate 中,我使用 {Binding .} 绑定(bind)到当前地址记录。这
如果我有以下简单的 js/knockout 代码: .js( View 模型): var image = ko.observable('http://placehold.it/300x150'); 看
我正在 aurelia 上开发一个自定义属性,让用户在输入文本区域时从列表中进行选择。例如,用法将是这样的: 正如您可能注意到的,auto-complete是属性。现在,当我想显示提示时,我想在自定
我正在使用 EventEmitter2作为我的应用程序内部的消息总线。现在我需要绑定(bind)和取消绑定(bind)一些事件处理程序。因为我也希望他们bind将它们添加到给定的上下文中,我最终得到以
我有以下函数调用: $(".selector").on("click", callback.bind(this, param1, param2)); 在我的回调函数中,我想使用绑定(bind)的 th
我目前正在试验新的编译绑定(bind),并且(再次)达到了我在拼图中遗漏了一个小问题:为什么我必须调用 Bindings.Update?直到现在,我还认为实现 INotifyPropertyChang
我正在阅读一本关于编写 JavaScript 框架的书,并找到了这段代码。但是我不明白它是如何工作的,尤其是 bind.bind 的用法?有人知道吗? var bind = Function.prot
我是一名优秀的程序员,十分优秀!