尝试在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) 如何使用解析器来解析跨越多行的记录?我需要解析树数据(并最终将其转换为树数据结构).我在下面的代码中遇到了难以跟踪的解析错误,但不清楚这是否是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贷款模式,可选功能参数
将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和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) 我有一个贷款模式,应用函数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> 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) 下面是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)