我真的很想知道差异在哪里,更一般地说,找出不能使用HLists的规范用例(或者说,不会比常规列表产生任何好处).
(我知道TupleNScala 中有22个(我相信),而一个只需要一个HList,但这不是我感兴趣的那种概念差异.)
我在下面的文字中标出了几个问题.它实际上可能没有必要回答它们,它们更倾向于指出我不清楚的事情,并指导某些方向的讨论.
我最近在SO上看到了几个人们建议使用HLists的答案(例如,由Shapeless提供),包括对这个问题的删除答案.它引发了这一讨论,从而引发了这个问题.
在我看来,只有当您静态地知道元素的数量及其精确类型时,才会使用hlists.这个数字实际上并不重要,但你似乎不太可能需要生成一个包含不同但静态精确已知类型的元素的列表,但是你不能静态地知道它们的数量.问题1:你甚至可以写一个这样的例子,例如,在循环中吗?我的直觉是,拥有静态精确的hlist与静态未知数量的任意元素(相对于给定的类层次结构的任意)只是不兼容.
如果这是真的,即你静态地知道数字和类型 - 问题2:为什么不使用n元组?当然,你可以类型安全地映射和折叠一个HList(你也可以,但不是类型安全地,借助于一个元组productIterator),但由于元素的数量和类型是静态已知的,你可能只是访问元组元素直接执行操作.
另一方面,如果f您在hlist上映射的函数是如此通用以至于它接受所有元素 - 问题3:为什么不通过它使用它productIterator.map?好的,一个有趣的区别可能来自方法重载:如果我们有几个重载f的,拥有hlist提供的更强的类型信息(与productIterator相反)可以允许编译器选择更具体的f.但是,我不确定这在Scala中是否真的有用,因为方法和功能不一样.
基于相同的假设,即您需要静态地知道元素的数量和类型 - 问题4:可以在元素依赖于任何类型的用户交互的情况下使用hlists吗?例如,想象用循环内的元素填充hlist; 从某个地方(UI,配置文件,演员交互,网络)读取元素,直到某个条件成立.什么类型的hlist是什么?类似于接口规范getElements:HList [...]应该使用静态未知长度的列表,并允许系统中的组件A从组件B获得这样的任意元素列表.
在Android上,我有一个WebView显示页面.
如何在不请求页面的情况下获取页面源?
似乎WebView应该有某种getPageSource()方法返回一个字符串,但唉它没有.
如果我启用JavaScript,那么在此调用中放入适当的JavaScript以获取内容是什么?
webview.loadUrl("javascript:(function() { " +
"document.getElementsByTagName('body')[0].style.color = 'red'; " +
"})()");
Run Code Online (Sandbox Code Playgroud) 我有一个使用了SBT管理斯卡拉项目通常SBT项目布局斯卡拉用宏,即项目,包含宏的主要项目,是实际应用和依赖于宏观子项目子项目.宏是宏注释,实质上是为常规类生成伴随对象.生成的伴随对象在其他成员中声明了apply/unapply方法.
我使用sbt-idea插件生成相应的IntelliJ IDEA项目,并使用IDEA的sbt-plugin中的sbt控制台来编译和运行我的Scala应用程序.
一切都或多或少都有效,除了生成的伴随对象,更重要的是它们的成员,如apply/unapply,IDEA无法识别.因此,我在任何地方都得到了一条波浪线,例如,一种应用方法.
我的设置是IntelliJ IDEA CE 133.471,在Windows 7 x64上使用插件SBT 1.5.1和Scala 0.28.363.
如何让IntelliJ IDEA识别由Scala宏生成的代码(类,对象,方法......)(准确地说是宏注释)?
是否已知其他IDE(例如Eclipse)在这样的设置中工作得更好?
这个问题(不太详细)基本上问了同样的问题,但还没有得到答复(2014-02-26).
根据JetBrains开发人员的说法,我要求的功能是他们的长期待办事项清单,但不会很快实施(2014-03-05).
以下嵌套的for循环让我很生气(在Windows 7上):
@echo off
SetLocal EnableDelayedExpansion
set TESTDIRS=fast mid slow
set TD=src\test\resources\testsuite
for %%d in (%TESTDIRS%) do (
set CTD=%TD%\%%d
echo CTD: !CTD!
REM Echos the expected path
echo CTD: %CTD%
REM Echos nothing -- understandable
for /R !CTD! %%f in (*.fs) do (echo %%f)
REM Echos nothing -- why?
for /R src\test\resources\testsuite\fast %%f in (*.fs) do (echo %%f)
REM Echos expected files
)
Run Code Online (Sandbox Code Playgroud)
我尝试了各种解决方案,包括禁用DelayedExpansion,call-statements和诸如此类的东西,但我从来没有让内循环工作.我知道我可以通过子程序调用替换内部循环,但是必须有一种方法可以使它与嵌套循环一起工作.
我正在Windows上开发Scala应用程序,我需要将文件的路径插入到HTML模板中.我使用Java io并nio使用文件和路径.
/* The paths actually come from the environment. */
val includesPath = Paths.get("foo\\inc")
val destinationPath = Paths.get("bar\\dest")
/* relativeIncludesPath.toString == "..\\foo\\inc", as expected */
val relativeIncludesPath = destinationPath.relativize(includesPath)
Run Code Online (Sandbox Code Playgroud)
问题是输出relativeIncludesPath.toString包含反斜杠\作为分隔符 - 因为应用程序在Windows上运行 - 但由于路径要插入到HTML模板中,因此它必须包含正斜杠/.
由于我file/path.toStringUsingSeparator('/')在文档中找不到任何类似的东西,我现在正在帮助自己relativeIncludesPath.toString.replace('\\', '/'),我觉得这很有吸引力.
问题:有没有比使用替换更好的方法?
我也尝试与Java的URI,但它relativize是不完整的.
考虑定义两个属性的抽象类
abstract class A {
def a: Int
def b: Int
// real A has additional members
}
Run Code Online (Sandbox Code Playgroud)
这是各种案例类的基类,如
case class Foo(a: Int, b: Int) extends A
case class Bar(a: Int, b: Int) extends A
// and many more
Run Code Online (Sandbox Code Playgroud)
目标:我最终希望能够以两种方式创建上述案例类的实例,即
val b1 = Bar(1, 2)
val b2 = Bar(1) has 2
assert(b1 == b2) // must hold
Run Code Online (Sandbox Code Playgroud)
方法:因此,定义一个帮助类来定义has并允许我部分构造As 似乎是合理的
case class PartialA(f: Int => A) {
def has(b: Int) = f(b)
}
Run Code Online (Sandbox Code Playgroud)
问题:当前机制不允许调用, …
考虑以下Scala片段:
case class Foo(v1: String, v2: Int, v3: Any)
def inspect(p: Product) =
(0 until p.productArity).foreach(i => println(p.productElement(i)))
inspect(Foo("Moin", 77, null))
Run Code Online (Sandbox Code Playgroud)
inspect()这里的调用是否意味着使用反射(以任何方式)?
我想以某种方式能够访问案例类的字段,而不必明确地引用它们,例如foo.v1,我喜欢不需要反射的解决方案,因为我希望它需要一些开销.
有等式Pell x*x - 193 * y*y = 1
在z3py:
x = BitVec('x',64)
y = BitVec('y',64)
solve(x*x - 193 * y*y == 1, x > 0, y > 0)
Run Code Online (Sandbox Code Playgroud)
结果: [y = 2744248620923429728, x = 8169167793018974721]
为什么?
PS有效答案:[y = 448036604040,x = 6224323426849]
我是Z3的新手,我正在查看在线python教程.
然后我想我可以检查BitVecs中的溢出行为.
我写了这段代码:
x = BitVec('x', 3)
y = Int('y')
solve(BV2Int(x) == y, Not(BV2Int(x + 1) == (y + 1)))
Run Code Online (Sandbox Code Playgroud)
我期待[y = 7,x = 7](即当值相等但后继不是因为x + 1将为0而y + 1将为8)
但Z3回答[y = 0,x = 0].
我究竟做错了什么?
scala ×4
z3 ×3
z3py ×3
case-class ×2
android ×1
batch-file ×1
compilation ×1
dsl ×1
field ×1
file ×1
for-loop ×1
hlist ×1
java ×1
loops ×1
nested ×1
object ×1
product ×1
reflection ×1
scala-macros ×1
shapeless ×1
tuples ×1
types ×1
windows ×1