我通常最终尝试每个组合,直到它编译.有人可以解释我应该在哪里使用?
我认为有一个@tailrec注释可以确保编译器优化尾递归函数.你刚才把它放在宣言面前吗?如果在脚本模式中使用Scala(例如:load <file>在REPL 下使用),它是否也有效?
是否有可能在Scala中实现与Python yield语句等效的东西,它会记住使用它的函数的本地状态,并在每次调用时"产生"下一个值?
我希望有这样的东西将递归函数转换为迭代器.有点像:
# this is python
def foo(i):
yield i
if i > 0:
for j in foo(i - 1):
yield j
for i in foo(5):
print i
Run Code Online (Sandbox Code Playgroud)
除此之外,foo可能更复杂并通过一些非循环对象图重现.
附加编辑: 让我添加一个更复杂的例子(但仍然很简单):我可以编写一个简单的递归函数来打印事物:
// this is Scala
def printClass(clazz:Class[_], indent:String=""): Unit = {
clazz match {
case null =>
case _ =>
println(indent + clazz)
printClass(clazz.getSuperclass, indent + " ")
for (c <- clazz.getInterfaces) {
printClass(c, indent + " ")
}
}
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我希望有一个库,允许我轻松更改一些语句并使其作为迭代器工作:
// this is not …Run Code Online (Sandbox Code Playgroud) 在Scala 2.8中,我需要调用List.min并提供我自己的比较函数来获取基于Tuple2的第二个元素的值.我不得不写这种代码:
val list = ("a", 5) :: ("b", 3) :: ("c", 2) :: Nil
list.min( new Ordering[Tuple2[String,Int]] {
def compare(x:Tuple2[String,Int],y:Tuple2[String,Int]): Int = x._2 compare y._2
} )
Run Code Online (Sandbox Code Playgroud)
有没有办法让这个更具可读性,或者像你可以用匿名函数创建一个Ordering list.sortBy(_._2)?
import scalaz._
import Scalaz._
"abc".parseInt
Run Code Online (Sandbox Code Playgroud)
这将返回一个Validation[NumberFormatException, Int].有没有办法可以在故障方面应用函数(例如toString)来获取Validation[String, Int]?
根据http://en.wikipedia.org/wiki/Fold_(higher-order_function),如果不需要评估完整列表,右侧折叠可以在无限列表上运行.这可以在haskell中看到:
Prelude> take 5 (foldr (:) [] [1 ..])
[1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)
这似乎在流的scala中不能很好地工作:
Stream.from(1).foldRight(Stream.empty[Int])( (i, s) => i #:: s).take(5)
// StackOverflowError
Run Code Online (Sandbox Code Playgroud)
或者在迭代器上:
Iterator.from(1).foldRight(Iterator.empty: Iterator[Int]){ (i, it) =>
Iterator.single(i) ++ it
}.take(5)
// OutOfMemoryError: Java heap space
Run Code Online (Sandbox Code Playgroud)
有没有一个实用的解决方案来实现Scala中的懒惰折叠?
试图从这个SO问题编译一些代码并遇到此错误消息cannot find class manifest for element type T.这是显示行为的另一个片段:
scala> def f[T](a:T, b:T):Array[T] = { new Array[T](2) }
<console>:4: error: cannot find class manifest for element type T
def f[T](a:T, b:T):Array[T] = { new Array[T](2) }
Run Code Online (Sandbox Code Playgroud)
我可以看到new collection.mutable.GenericArray[T](2)解决了这个问题.显然提供清单是另一种选择......但是"提供明显的意思"是什么?
我已经做了很长一段时间的Java并且大约6个月前开始使用Scala.我喜欢这门语言.我发现的一件事是有多种方法可以做.我不知道这是因为语言的性质还是因为它还很年轻而且不断发展,习惯用法和最佳实践还没有出现.
让我感到惊讶的是,我一直是perl人的蟒蛇,其中:
"应该有一个 - 最好只有一个 - 明显的做法."
对我来说比对我更有意义
"有不止一种方法可以做到这一点".
我很想知道你认为Scala适合这种规模的原因以及为什么?
我试图将卡迪纳的一个例子转化为伊德里斯- 一种带有依赖型 纸张的语言.
这是我到目前为止:
PrintfType : (List Char) -> Type
PrintfType Nil = String
PrintfType ('%' :: 'd' :: cs) = Int -> PrintfType cs
PrintfType ('%' :: 's' :: cs) = String -> PrintfType cs
PrintfType ('%' :: _ :: cs) = PrintfType cs
PrintfType ( _ :: cs) = PrintfType cs
printf : (fmt: List Char) -> PrintfType fmt
printf fmt = rec fmt "" where
rec : (f: List Char) -> String -> PrintfType …Run Code Online (Sandbox Code Playgroud)