小编huy*_*hjl的帖子

Any,AnyVal,AnyRef,Object之间的关系是什么?它们在Java代码中使用时如何映射?

我通常最终尝试每个组合,直到它编译.有人可以解释我应该在哪里使用?

scala

108
推荐指数
3
解决办法
3万
查看次数

什么是Scala注释以确保优化尾递归函数?

我认为有一个@tailrec注释可以确保编译器优化尾递归函数.你刚才把它放在宣言面前吗?如果在脚本模式中使用Scala(例如:load <file>在REPL 下使用),它是否也有效?

scala tail-call-optimization

91
推荐指数
3
解决办法
5万
查看次数

斯卡拉兹州的monad例子

我没见过很多scalaz state monad的例子.有这个例子,但很难理解,似乎只有一个关于堆栈溢出的问题.

我将发布一些我玩过的例子,但我会欢迎其他的例子.此外,如果有人可以提供上的例子,为什么init,modify,putgets用于将是巨大的.

编辑:是一个关于州monad的令人敬畏的2小时演讲.

scala state-monad scalaz

76
推荐指数
3
解决办法
1万
查看次数

Scala相当于Python生成器?

是否有可能在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)

python scala

55
推荐指数
2
解决办法
2万
查看次数

在Scala中,如何在List.min或List.max中使用Ordering [T]并保持代码可读

在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)

scala

28
推荐指数
5
解决办法
2万
查看次数

映射Scalaz验证失败

import scalaz._
import Scalaz._

"abc".parseInt
Run Code Online (Sandbox Code Playgroud)

这将返回一个Validation[NumberFormatException, Int].有没有办法可以在故障方面应用函数(例如toString)来获取Validation[String, Int]

scala scalaz

18
推荐指数
2
解决办法
1568
查看次数

foldRight在无限懒惰的结构上

根据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中的懒惰折叠?

scala fold

18
推荐指数
1
解决办法
3057
查看次数

找不到元素类型T的类清单

试图从这个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)解决了这个问题.显然提供清单是另一种选择......但是"提供明显的意思"是什么?

scala scala-2.8

17
推荐指数
1
解决办法
3750
查看次数

Scala程序员 - "应该有一种明显的方法来实现它"或"不止一种方式"吗?

我已经做了很长一段时间的Java并且大约6个月前开始使用Scala.我喜欢这门语言.我发现的一件事是有多种方法可以做.我不知道这是因为语言的性质还是因为它还很年轻而且不断发展,习惯用法和最佳实践还没有出现.

让我感到惊讶的是,我一直是perl人的蟒蛇,其中:

"应该有一个 - 最好只有一个 - 明显的做法."

对我来说比对我更有意义

"有不止一种方法可以做到这一点".

我很想知道你认为Scala适合这种规模的原因以及为什么?


行情:Python PEP20Perl引用

design-patterns functional-programming scala

15
推荐指数
2
解决办法
1129
查看次数

在Idris中依赖键入printf

我试图将卡迪纳的一个例子转化为伊德里斯- 一种带有依赖型 纸张的语言.

这是我到目前为止:

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)

idris

15
推荐指数
1
解决办法
972
查看次数