我正在利用Scala在业余时间学习函数式编程,我有一个闲置的新手问题.
在做像Haar小波变换这样的事情时,我可以看到具有不可变对象的优雅 - 即当数据本身由对象表示时不会改变.
但我看到一个博客,其中有人以小游戏为例证明了不变性.如果一个生物对象收到了伤害,它没有改变它的状态 - 它返回了一个新的生物对象,其中包含新的生命值和一个新的"aggro to X"标志.但是,如果我们设计像MMORPG这样的东西,魔兽世界说.战场上的一百名玩家......可能有成千上万的攻击和缓冲/减益效果以不同的方式影响他们.是否仍然可以使用完全不可变的对象来设计系统?对我来说,似乎每个'滴答'会有一大群新的实例.为了获得当前有效的对象实例,所有客户端都会不断地经历某种中心"游戏世界"对象,或者?
函数式编程是否适用于此,或者这是"最佳工作的最佳工具,可能在这里不可变"的情况?
使用Scala的命令行REPL:
def foo(x: Int): Unit = {}
def foo(x: String): Unit = {println(foo(2))}
Run Code Online (Sandbox Code Playgroud)
给
error: type mismatch;
found: Int(2)
required: String
Run Code Online (Sandbox Code Playgroud)
看来你无法在REPL中定义重载的递归方法.我认为这是Scala REPL中的一个错误并提交了它,但它几乎立即关闭了"wontfix:我没有看到任何方式这可以支持解释器的语义,因为这两个方法必须编译一起." 他建议将方法放在一个封闭的对象中.
是否有JVM语言实现或Scala专家可以解释原因?我可以看到,如果这些方法相互调用,那将是一个问题,但在这种情况下?
或者,如果这个问题太大而且您认为我需要更多必备知识,那么是否有人有关于语言实现的书籍或网站的任何良好链接,特别是在JVM上?(我知道约翰罗斯的博客,以及编程语言语用学一书......但这就是它.:)
我正在做Cay Horstmann的组合器解析器练习,我想知道区分表示数字的字符串和表示匹配语句中的变量的字符串的最佳方法:
def factor: Parser[ExprTree] = (wholeNumber | "(" ~ expr ~ ")" | ident) ^^ {
case a: wholeNumber => Number(a.toInt)
case a: String => Variable(a)
}
Run Code Online (Sandbox Code Playgroud)
那里的第二行,"案例a:整数"不合法.我想到了一个正则表达式,但还没有找到一种方法让它与"案例"一起工作.
尝试使用Clojure在"计算机程序的结构和解释"中练习1.16(fast-exp的迭代版本)我提出了这个:
(defn fast-it-exp [base exp res]
(cond (= exp 0) res
(odd? exp) fast-it-exp base (- exp 1) (* base res)
:else fast-it-exp base (/ exp 2) (* base base res)))
Run Code Online (Sandbox Code Playgroud)
尝试一下:
user=> (fast-it-exp 0 0 10)
10 ;yep
user=> (fast-it-exp 2 2 2)
1 ;no...
user=> (fast-it-exp 1 1 1)
#<user$fast_it_exp__59 user$fast_it_exp__59@138c63> ;huh?!
Run Code Online (Sandbox Code Playgroud)
似乎cond表达式的"奇数"部分返回一个函数而不是求值.为什么?我已经尝试在谓词后面的表达式附加括号,但这似乎是不正确的语法,这是我能够想出的最好的.我正在使用Clojure的rev 1146.
在Scala中使用regexp时我写了这样的东西:
scala> val y = "Foo"
y: java.lang.String = Foo
scala> y "Bar"
scala>
Run Code Online (Sandbox Code Playgroud)
如您所见,第二个语句只是默默接受.这是合法的法律声明,如果是,它会做什么?或者它是解析器中的错误,应该有错误消息?
scala ×3
clojure ×1
combinators ×1
immutability ×1
jvm ×1
notation ×1
parsing ×1
recursion ×1
syntax ×1