sealed abstract trait HList
case class :+:[H, T <: HList](head: H, tail: T) extends HList {
def :+:[T](v: T) = new :+:(v, this)
}
case object HNil extends HList {
def :+:[T](v: T) = new :+:(v, this)
}
object HListExpt {
def main(args: Array[String]) {
val me: String :+: Int :+: Symbol :+: HNil.type = "Rahul" :+: 20 :+: 'Male :+: HNil
println(me.head, me.tail.head)
}
}
Run Code Online (Sandbox Code Playgroud)
在尝试编译上面的代码时,我得到以下编译器错误:
error: type mismatch;
found : :+:[java.lang.String,:+:[Int,:+:[Symbol,object HNil]]]
required: :+:[String,:+:[Int,:+:[Symbol,HNil.type]]]
val me: String :+: …Run Code Online (Sandbox Code Playgroud) 我需要定义一个类型类Field,如下所示:
trait Field[A] {
// Additive identity
def zero: A
// Multiplicative identity
def one: A
}
Run Code Online (Sandbox Code Playgroud)
的Numeric类型的类还提供了方法,zero和one.
我希望Numeric在Field需要具有实例的类的任何地方都可以使用实例可用的每个类.例如,以下内容应该有效:
def func[F: Field](f: F) = println(f)
func(2)
Run Code Online (Sandbox Code Playgroud)
你能建议如何实现这个目标吗?我尝试了以下但它不起作用:
scala> implicit def numericToField[N](n: Numeric[N]) = new Field[N] {
| def zero = n.zero
| def one = n.one
| }
numericToField: [N](n: Numeric[N])java.lang.Object with Field[N]
scala> def func[F: Field](f: F) = println(f)
func: [F](f: F)(implicit evidence$1: Field[F])Unit
scala> func(2)
<console>:12: …Run Code Online (Sandbox Code Playgroud) 如何foreachWithIndex在Scala集合上添加方法?
这是我到目前为止所能提出的:
implicit def iforeach[A, CC <: TraversableLike[A, CC]](coll: CC) = new {
def foreachWithIndex[B](f: (A, Int) => B): Unit = {
var i = 0
for (c <- coll) {
f(c, i)
i += 1
}
}
}
Run Code Online (Sandbox Code Playgroud)
这不起作用:
Vector(9, 11, 34).foreachWithIndex { (el, i) =>
println(el, i)
}
Run Code Online (Sandbox Code Playgroud)
引发以下错误:
error: value foreachWithIndex is not a member of scala.collection.immutable.Vector[Int]
Vector(9, 11, 34).foreachWithIndex { (el, i) =>
Run Code Online (Sandbox Code Playgroud)
但是,当我明确应用转换方法时,代码可以正常工作:
iforeach[Int, Vector[Int]](Vector(9, 11, 34)).foreachWithIndex { (el, i) =>
println(el, i) …Run Code Online (Sandbox Code Playgroud) scala implicit-conversion scala-collections enrich-my-library
scala> val a = Need(20)
a: scalaz.Name[Int] = scalaz.Name$$anon$2@173f990
scala> val b = Need(3)
b: scalaz.Name[Int] = scalaz.Name$$anon$2@35201f
scala> for(a0 <- a; b0 <- b) yield a0 + b0
res90: scalaz.Name[Int] = scalaz.Name$$anon$2@16f7209
scala> (a |@| b)
res91: scalaz.ApplicativeBuilder[scalaz.Name,Int,Int] = scalaz.ApplicativeBuilde
r@11219ec
scala> (a |@| b) { _ + _ }
<console>:19: error: ambiguous implicit values:
both method FunctorBindApply in class ApplyLow of type [Z[_]](implicit t: scala
z.Functor[Z], implicit b: scalaz.Bind[Z])scalaz.Apply[Z]
and value nameMonad in object Name of type => …Run Code Online (Sandbox Code Playgroud) 例如,假设我想编写一个length返回给定结构长度的函数,因为它Length在范围内有一个类型为class (来自Scalaz)的实例.
这就是我目前定义它的方式:
scala> def length[A, F[_] : Length]: F[A] => Int = _.len
length: [A, F[_]](implicit evidence$1: scalaz.Length[F])F[A] => Int
Run Code Online (Sandbox Code Playgroud)
然而,诸如length(List(2, 3))失败的调用因为在这种情况下隐式参数是所需的第一个参数.
scala> length(List(2, 3))
<console>:15: error: type mismatch;
found : List[Int]
required: scalaz.Length[?]
length(List(2, 3))
^
Run Code Online (Sandbox Code Playgroud)
我认为length(implicitly)(List(2, 3))会起作用,但它最终导致崩溃(这种类型推断从左向右流动是可以理解的).提供显式类型注释有效,但它难以忍受.
scala> length(implicitly[Length[List]])(List(2, 3))
res16: Int = 2
Run Code Online (Sandbox Code Playgroud)
是否有一种编写第一类函数的好方法,例如length,具有上下文绑定,可以像使用站点上的常规函数一样干净地调用它?(像length(List(2, 3)))
我正在我的程序中读取一个文本文件,其中包含一些Unicode BOM字符\ufeff/ 65279位置.这在进一步解析中提出了几个问题.
现在我自己检测并过滤这些字符,但想知道Java标准库或Guava是否有办法更干净地完成这项工作.
在Actionscript中,您可以让变量保存对类类型的引用,然后将类的实例与变量进行比较is.例:
var a:Foo = new Foo();
var type:Class = Foo;
if(a is type){ //this is true
//do something
}
Run Code Online (Sandbox Code Playgroud)
你能用C#做类似的事吗?或者"is"关键字是否必须后跟一个类?
数组编程语言(也称为向量或多维语言)概括了对标量的操作,以透明地应用于向量,矩阵和更高维数组.
是否有可能在Scala中实现这种代码重用?
我的问题是,如果可以在scala中重载构造函数?
所以我可以编写如下代码:
var = new Foo(1)
var = new Foo("bar")
Run Code Online (Sandbox Code Playgroud)
如果不可能,有没有相同的技巧?
我有以下代码,我觉得它因为重复而臭vi.我怎样才能更好地写出来?
vi = '([a-zA-Z0-9_\-\.]+)'
handlers = [
(r'/register', RegistrationHandler),
(r'/profiles/%s/%s' % (vi, vi), GetProfiles),
(r'/archives/%s/%s/%s/%s' % (vi, vi, vi, vi), GetArchives),
(r'/publish-profiles', PublishProfiles),
(r'/publish-bundle/%s/%s' % (vi, vi), PublishBundle),
(r'/upload-file/%s/%s/%s' % (vi, vi, vi), UploadFile),
(r"/favicon\.ico", tornado.web.StaticFileHandler, dict(path=settings['static_path'])),
]
Run Code Online (Sandbox Code Playgroud)