有路径依赖的类型,我认为这是可能的,表达了这样的语言作为警句或阿格达Scala中的几乎所有功能,但我不知道为什么斯卡拉不支持此更明确地像它非常漂亮,在其他领域(比如,DSLs)?我缺少的任何东西都像"没有必要"?
我现在已经做了一些HList的实现.一个基于丹尼尔斯皮瓦克在斯卡拉之地的高级巫术讲话,另一个基于Apocalisp博客中的帖子.目标是有一个异类列表,其中主要类型不是异质的,而是更高类型.例如:
val requests = Request[String] :: Request[Int] :: HNil
Run Code Online (Sandbox Code Playgroud)
我可以在列表中执行映射来执行请求,并生成更高类型的异构列表.所以:
requests.map(execute)
Run Code Online (Sandbox Code Playgroud)
应该相等
String :: Int :: HNil
Run Code Online (Sandbox Code Playgroud)
可悲的是,我的所有尝试都产生了任何HList.以下是最近尝试的代码:
class Request[+Out](o:Out) {
type O = Out
def v:O = o
}
object HList {
trait Func[-Elem,Out] {
type Apply[E <: Elem] <: Out
def apply[N <: Elem](e:N):Apply[N]
}
sealed trait HList[Base] {
type Head <: Base
type Tail <: HList[Base]
type Map[Out,F <: Func[Base,Out]] <: HList[Out]
def head:Head
def tail:Tail
def ::[A <: Base](a:A):HList[Base]
def map[Out,F <: Func[Base,Out]](f:F):Map[Out,F]
}
case class …Run Code Online (Sandbox Code Playgroud) 在Scala中,我们可以为低级类型定义类型级别的标识函数,如下所示,
type Id[A] = A
Run Code Online (Sandbox Code Playgroud)
我们还可以为更高级别的类型定义类似的东西吗?IE浏览器.我们可以填写空白,
type HKId[A[...]] = ...
Run Code Online (Sandbox Code Playgroud)
所以类似于HKId [List]的东西让我们回到List类型构造函数?
在诸如此类的东西中绑定自由名称
type Foo[X] = List[X]
val l : Foo[Int] = List(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)
可能会让我们期待一个更高级的类型级别的身份看起来像,
type HKId[A[X]] = A[X]
Run Code Online (Sandbox Code Playgroud)
但scalac抱怨在RHS上找不到X型.
是否有一些聪明的编码可以解决这个问题?或者现在是不可能的?
我需要一个Map,我在其中放入不同类型的值(Double,String,Int,...),key可以是String.
有没有办法做到这一点,以便我得到正确的类型与map.apply(k)喜欢
val map: Map[String, SomeType] = Map()
val d: Double = map.apply("double")
val str: String = map.apply("string")
Run Code Online (Sandbox Code Playgroud)
我已经尝试了泛型类型
class Container[T](element: T) {
def get: T = element
}
val d: Container[Double] = new Container(4.0)
val str: Container[String] = new Container("string")
val m: Map[String, Container] = Map("double" -> d, "string" -> str)
Run Code Online (Sandbox Code Playgroud)
但是由于Container需要参数,所以不可能.这有什么解决方案吗?
给定是一个Java方法,它返回java.lang.Object给定字符串的s.我想将此方法包装在Scala方法中,该方法将返回的实例转换为某种类型T.如果转换失败,则应返回该方法None.我正在寻找类似的东西:
def convert[T](key: String): Option[T] = {
val obj = someJavaMethod(key)
// return Some(obj) if obj is of type T, otherwise None
}
convert[Int]("keyToSomeInt") // yields Some(1)
convert[String]("keyToSomeInt") // yields None
Run Code Online (Sandbox Code Playgroud)
(如何)使用Scala的反射API可以实现这一目标吗?我很清楚,convert可能必须改变签名.
假设您有类似以下的案例类
case class Test1(a:String,b:Int,c:Char)
case class Test2(a:String,b:Int)
Run Code Online (Sandbox Code Playgroud)
并使用以下变量实例化类
val test1 = Test1("first",2,'3')
val test2 = Test2("1st",20)
Run Code Online (Sandbox Code Playgroud)
有没有办法使用该.copy方法(或其他方法),将Test2中的变量应用于Test1,如
val test3 = test1.copy(test2) //Note this isn't valid scala code
// Result should be ("1st",20,'3')
Run Code Online (Sandbox Code Playgroud)
如果在纯scala中这是不可能的,那么它将如何在Shapeless 1/2中完成(当前代码在Shapeless 1中,但我们计划在某个时间点升级到Shapeless 2)
我有一个Eclipse功能,其中包含几个包.我想告诉p2将其中一个软件包标记为在安装该功能时启动.这可以使用捆绑自己的META-INF/p2.inf这样,
instructions.configure = markStarted(started: true)
Run Code Online (Sandbox Code Playgroud)
但我想在功能级别而不是捆绑级别执行此操作(有问题的捆绑包是第三方,如果可能的话,我不希望以任何方式修改它).
一些研究让我看到了这个文档,它表明应该可以将配置指令移动到包含特征的p2.inf.我尝试过所有明显的事情,比如
units.0.id = <bundle symbolic name>
units.0.instructions.configure = \
org.eclipse.equinox.p2.touchpoint.eclipse.markStarted(started: true)
Run Code Online (Sandbox Code Playgroud)
但到目前为止,我尝试的所有排列都没有任何影响:因为没有任何反应,捆绑包没有标记为已启动且未报告任何错误).
任何指针都会非常受欢迎.使用Eclipse Equinox Galileo(3.5.2)...与Helios相关的答案也非常有用.
我正在编写类似于具有可变维度的数组的代码.我所做的是维护线性底层集合并使用索引访问方法将其包装起来.由于数据结构的维度未知,我写的是类似的东西
def apply(i: Int*): Double = ...
Run Code Online (Sandbox Code Playgroud)
而且效果很好.但是,我不能做同样的事情更新方法和运算符,如+ =,所以我最终写的方法,如
def set(v: Double, i: Int*) ...
def add(v: Double, i: Int*) ...
Run Code Online (Sandbox Code Playgroud)
这很好,但不是我真正想要的.我想有关更新的问题可以通过两种方式解决:
关于+ =的问题似乎更复杂,甚至在索引具有固定长度时也存在.也许我们可以添加一个具有+ =运算符的对象并使用this(...)来获取对象(这样(...)+ = v将调用我们期望的某个方法),但这会与申请方法.
如果有人对上述任何问题有解决方案或有理由说我们不能编写这样的代码,请分享您的想法!谢谢〜
案例类在scala中似乎没有隐式排序.
scala> case class A(i:Int)
defined class A
scala> implicitly[Ordering[A]]
<console>:10: error: No implicit Ordering defined for A.
implicitly[Ordering[A]]
Run Code Online (Sandbox Code Playgroud)
我想知道是否总是为所有案例类定义一个隐式排序,如果不是,至少有一种方法可以为相同成员类型的案例类/案例类的每个arity定义隐式排序.
我希望添加一个整数元组列表,即给定arity元组的输入列表k,生成一个arity元组k,其字段是列表中元组的相应字段的总和.
List( (1,2,3), (2,3,-3), (1,1,1))
Run Code Online (Sandbox Code Playgroud)
(4, 6, 1)
Run Code Online (Sandbox Code Playgroud)
我试图使用foldLeft,但我无法编译.现在,我正在使用for循环,但我正在寻找一个更简洁的解决方案.