小编Ais*_*ish的帖子

在Scala中,如何定义在运行时工作的联合类型?

接下来就如何在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在运行时之前不知道参数,您会怎么做?也许你正在削减包含Foos 的数据的文件,在这种情况下,在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)

functional-programming scala union-types

3
推荐指数
1
解决办法
1212
查看次数

在Mac 10.8上Rcpp安装失败

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)

我究竟做错了什么?

r rcpp

2
推荐指数
1
解决办法
1193
查看次数

标签 统计

functional-programming ×1

r ×1

rcpp ×1

scala ×1

union-types ×1