接下来就如何在Scala中定义联合类型形成了这一组优秀的答案.我一直在使用Miles Sabin对Union类型的定义,但仍有一个问题.
如果直到运行时才知道类型,你如何使用这些?例如:
trait inv[-A] {}
type Or[A,B] = {
type check[X] = (inv[A] with inv[B]) <:< inv[X]
}
case class Foo[A : (Int Or String)#check](a: A)
Foo(1) // Foo[Int] = Foo(1)
Foo("hi") // Foo[String] = Foo(hi)
Foo(2.0) // Error!
Run Code Online (Sandbox Code Playgroud)
此示例有效,因为参数A
在编译时已知,并且调用Foo(1)
实际上正在调用Foo[Int](1)
.但是,如果A
在运行时之前不知道参数,您会怎么做?也许你正在削减包含Foo
s 的数据的文件,在这种情况下,在Foo
读取数据之前不知道类型参数.A
在这种情况下,没有简单的方法来设置参数.
我能够提出的最佳解决方案是:
模式匹配您已阅读的数据,然后Foo
根据该类型创建不同的数据.在我的情况下,这是不可行的,因为我的case-class实际上包含了几十个union类型,因此有数百种类型的组合来模式匹配.
转换您刚读过的类型(String or Int)
,因此您只能传递一种类型,在Foo
使用它时传递Type Class约束.然后返回Foo[_]
.这使得Foo用户有责任计算出每个字段的类型(因为它们看起来都是Any类型),但至少在实际使用字段之前它必须知道类型,在这种情况下,模式匹配似乎更容易处理.
第二个解决方案如下所示:
def parseLine: Any // Parses …
Run Code Online (Sandbox Code Playgroud) Rcpp无法为我安装.当我在R控制台中运行以下内容时(Mac 10.8上的R 2.15.1):
install.packages("Rcpp")
我收到以下错误:
/usr/bin/clang++ -I/usr/local/Cellar/r/2.15.1/R.framework/Resources/include \
-DNDEBUG -I../inst/include/ -I/usr/local/Cellar/readline/6.2.4/include \
-isystem /usr/local/include -I/opt/X11/include -fPIC -Os -w -pipe - \
march=native -Qunused-arguments -mmacosx-version-min=10.8 \
-c exceptions.cpp -o exceptions.o
exceptions.cpp:82:14: fatal error: 'bits/exception_defines.h' file not found
#include <bits/exception_defines.h>
^
1 error generated.
make: *** [exceptions.o] Error 1
ERROR: compilation failed for package ‘Rcpp’
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?