小编ept*_*ptx的帖子

有关通用Scala函数的更多信息

尝试在Scala中实现以下Haskell函数(来自Learn You a Haskell ...),以便它可以与Int,Double等一起使用.

doubleUs x y = x * 2 + y * 2 
Run Code Online (Sandbox Code Playgroud)

请注意,这与Scala类似:如何定义"通用"函数参数?

这是我的尝试和错误.有人可以解释正在发生的事情并提供解决方案.谢谢.

scala> def doubleUs[A](x:A,y:A)(implicit numeric: Numeric[A]): A = numeric.plus(numeric.times(x,2),numeric.times(y,2)) 
<console>:34: error: type mismatch;
 found   : Int(2)
 required: A
       def doubleUs[A](x:A,y:A)(implicit numeric: Numeric[A]): A = numeric.plus(numeric.times(x,2),numeric.times(y,2)) 
Run Code Online (Sandbox Code Playgroud)

polymorphism haskell scala numeric

21
推荐指数
3
解决办法
1284
查看次数

Scala,树结构化数据的解析器组合

如何使用解析器来解析跨越多行的记录?我需要解析树数据(并最终将其转换为树数据结构).我在下面的代码中遇到了难以跟踪的解析错误,但不清楚这是否是Scala解析器的最佳方法.问题更多的是解决问题的方法,而不是调试现有的代码.

EBNF-ish语法是:

SP          = " "
CRLF        = "\r\n"
level       = "0" | "1" | "2" | "3"
varName     = {alphanum}
varValue    = {alphnum}
recordBegin = "0", varName
recordItem  = level, varName, [varValue]
record      = recordBegin, {recordItem}
file        = {record}
Run Code Online (Sandbox Code Playgroud)

试图实现和测试语法:

import util.parsing.combinator._
val input = """0 fruit
1 id 2
1 name apple
2 type red
3 size large
3 origin Texas, US
2 date 2 aug 2011
0 fruit
1 id 3
1 name apple
2 type green …
Run Code Online (Sandbox Code Playgroud)

scala parser-combinators

6
推荐指数
1
解决办法
1443
查看次数

如何重载scala函数应用方法

作为后续:scala贷款模式,可选功能参数

将withLoaner param移动到重载的apply方法的正确语法是什么?我试过以下几个版本失败了.此外,任何洞察我的错误在概念上非常赞赏.

def withLoaner = new {
  def apply(n:Int, op: Int => String):String = (1 to n).map(op).mkString("\n")
  def apply(n:Int, op: () => String):String = apply{n, i:Int => op()} // no compile
  def apply(op: () => String):String = apply{1, i:Int => op()} // no compile
}
Run Code Online (Sandbox Code Playgroud)

scala overloading

6
推荐指数
1
解决办法
6380
查看次数

Scala和Java的Builder库

我需要一个可以从Scala和Java调用的构建器库.使用默认的命名参数在Scala中足够简单.但是如何从Java调用此代码?见下文.或者我应该使用更流行的两种语言更常见的API?

斯卡拉:

case class Person(gender:Gender.Value, firstName:String, lastName:String){
  def fullName = lastName+", "+firstName
  override def toString = firstName+","+lastName+","+gender
}
case class PersonBob(
  gender:Gender = GenderBob().build,
  firstName:String =  null,
  lastName:String = null) {
  def build = Person(
    gender,
    if(firstName == null) NameBob(if(gender==Gender.Male) engMaleNames 
      else engFemaleNames).build else firstName,
    if(lastName==null) NameBob(engLastNames).build 
      else lastName
    )
  }
Run Code Online (Sandbox Code Playgroud)

用法:

val p1 = PersonBob().build
val p2 = PersonBob(lastName = "Jones").build
Run Code Online (Sandbox Code Playgroud)

Java用法:

Person p1 = ?
Person p2 = ?
Run Code Online (Sandbox Code Playgroud)

java scala scala-java-interop

5
推荐指数
1
解决办法
770
查看次数

scala贷款模式,可选功能参数

我有一个贷款模式,应用函数n次,其中'i'是递增变量."偶尔",我希望传入的函数可以访问'i'....但我不想要求传入的所有函数都要求定义一个param来接受'i'.以下示例......

def withLoaner = (n:Int) => (op:(Int) => String) => {
  val result = for(i <- 1 to n) yield op(i)
  result.mkString("\n")
}

def bob = (x:Int) => "bob" // don't need access to i. is there a way use () => "bob" instead?
def nums = (x:Int) => x.toString // needs access to i, define i as an input param

println(withLoaner(3)(bob))

println(withLoaner(3)(nums))
Run Code Online (Sandbox Code Playgroud)

scala

5
推荐指数
1
解决办法
1446
查看次数

Scala XML,获取父节点属性值匹配的节点

有什么方法可以简化以下内容?或者用另一个函数减少样板代码?

scala> val ns = <foo><bar id="1"><tag>one</tag><tag>uno</tag></bar><bar id="2"><tag>two</tag><tag>dos</tag></bar></foo>
ns: scala.xml.Elem = <foo><bar id="1"><tag>one</tag><tag>uno</tag></bar><bar id="2"><tag>two</tag><tag>dos</tag></bar></foo>

scala> (ns \\ "bar" filterNot{_ \\ "@id"  find { _.text == "1" } isEmpty}) \\ "tag"
res0: scala.xml.NodeSeq = NodeSeq(<tag>one</tag>, <tag>uno</tag>)
Run Code Online (Sandbox Code Playgroud)

xml xpath scala

5
推荐指数
1
解决办法
4446
查看次数

用于Scala和Java的类型安全的Builder库

下面是Scala中类型安全,流畅的构建器模式,如http://www.tikalk.com/java/blog/type-safe-builder-scala-using-type-constraints中所述.它与Scala和Java的Builder Library类似,但特别涉及编译时构建器检查.这怎么能从Java调用?可以使用干净的Scala Java API来实现"scala.Predef $$ eq $ colon $ eq"参数吗?

sealed trait TBoolean
sealed trait TTrue extends TBoolean
sealed trait TFalse extends TBoolean

class Builder[HasProperty <: TBoolean] private(i: Int) {
  protected def this() = this(-1)
  def withProperty(i: Int)(implicit ev: HasProperty =:= TFalse) = new Builder[TTrue](i)
  def build(implicit ev: HasProperty =:= TTrue) = println(i)
}

//javap output
    public class Builder extends java.lang.Object implements scala.ScalaObject{
    public Builder withProperty(int, scala.Predef$$eq$colon$eq); //How is this called from Java?
    public void …
Run Code Online (Sandbox Code Playgroud)

java scala scala-java-interop

4
推荐指数
1
解决办法
1144
查看次数