或者如何在映射时避免意外删除重复项Set?
这是我经常犯的错误.看下面的代码:
def countSubelements[A](sl: Set[List[A]]): Int = sl.map(_.size).sum
Run Code Online (Sandbox Code Playgroud)
该函数应计算所有包含列表的累计大小.问题是在将列表映射到它们的长度之后,结果仍然是a,Set并且所有大小为1的列表都减少为单个代表.
这只是我有这个问题吗?我能做些什么来防止这种情况发生?我想我很想有两种方法mapToSet,并mapToSeq为Set.但是没有办法强制执行此操作,有时您不会在本地注意到您正在使用Set.
也许你甚至有可能Seq在另一个类中编写代码以及某些更改并且底层对象变成了Set?
也许是最好的做法,不要让这种情况出现?
想象一下以下情况:
val totalEdges = graph.nodes.map(_.getEdges).map(_.size).sum / 2
Run Code Online (Sandbox Code Playgroud)
您Node从图形中获取对象的集合,使用它们来获取它们的相邻边缘并对它们求和.如果graph.nodes返回a,则有效Seq.
如果某人决定将Graph其节点作为一个返回,它就会中断Set; 没有这个代码看起来可疑(至少不是我,你认为每个集合可能最终成为一个Set?)而不触及它.
我有一个值列表,我可以从中构建一个解析器列表,它通过映射依赖于这些值(参见示例).那么我想要做的是通过连接将解析器列表转换为单个解析器.
一种可能性是使用foldLeft和~:
parsers.foldLeft(success(Nil)){case (ps,p) => rs ~ p ^^ {case xs ~ x => x ::xs}} ^^ (_.reverse)
Run Code Online (Sandbox Code Playgroud)
我不知道组合器解析器是如何工作的; 会有一个深度为列表长度的调用堆栈吗?因此,我可能会遇到SO错误很长时间的连接?
有不同的方式更具可读性吗?
假设您有一个包含两行的文件.第一行包含n个整数x_1到x_n.第二行包含根据第一行属于组的x_1 + x_2 + ... x_n整数.我想从第一行获取整数序列并创建n个解析器p_1到p_n,其中p_i解析x_i整数.
假设我有l = List(1,2,3)第一行的整数列表.对于每个整数,n我创建一个解析n整数的解析器:parsers = l.map(repN(_,integer)).
假设我有一个类型类Graph[G,V],它声明类型的对象G也是一个顶点类型的图形V.
现在我有一个隐含的,让我将类型对的集合A视为具有类型顶点的图形A(不能表达未连接的顶点......).我可以通过导入以下对象的范围来使用隐式.
object TupleSetGraph{
  implicit def ts2graph[A]: Graph[Set[(A,A)],A] = new Graph[Set[(A,A)],A] {
    def nodes(g: Set[(A, A)]): Set[A] = g flatMap (t => Set(t._1,t._2))
    def adjacent(g: Set[(A, A)], n1: A, n2: A): Boolean = g.contains((n1,n2)) || g.contains((n2,n1))
  }
}
Run Code Online (Sandbox Code Playgroud)
假设我还希望能够映射顶点的内容,从而能够执行以下操作:
(_: Set[(A,A)]).map((_: A => B)): Set[(B,B)]
Run Code Online (Sandbox Code Playgroud)
但是已经map定义了Set.如何处理同一数据结构可以被视为同一事物(具有某种map功能的东西)的问题?
Scalaz提供了对有状态计算的很好的抽象:ST monad.
ST monad允许以功能形式捕获副作用计算.
在Haskell中,我想,使用这样的monad是有效实现某些命令式算法的唯一方法.
但是在Scala中,如果需要,我可以简单地使用可变数据结构.
我发现,使用Scalaz的功能概念带来了计算开销.例如,请参阅此问题.因此,如果期望的目标是效率的提高,那么使用ST monad从功能实现切换到功能实现似乎是不合理的.
我问的是:
假设我想要一个像Java这样的类Date.它唯一的数据成员是一个long,表示自1970年以来的毫秒数.
是/可能只是制作新的Scala类型的任何性能优势:
type PrimitiveDate = Long
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用隐式转换添加方法,就像对int一样RichInt.原始类型的这种"拳击"是否涉及任何开销(类创建)?基本上你可以有一个静态方法
def addMonth(date: PrimitiveDate, months: Int): PrimitiveDate = date + 2592000000 * months
Run Code Online (Sandbox Code Playgroud)
让类型系统弄清楚它必须d addMonth 5
 在代码中出现时应用.
编辑
看来你通过编写创建的别名type PrimitiveDate = Long不是由scala编译器强制执行的.创建一个合适的类,包含Long,这是在Scala中创建强制类型的唯一方法吗?
您认为能够为基本类型创建强制类型别名有用吗?
我认为这可能是一种常见的操作.所以也许它在API内部,但我找不到它.如果没有,我也对有效的功能/简单解决方案感兴趣.
给定一系列元组,("a" -> 1, "b" ->2, "c" -> 3)我想把它变成一个地图.这很容易使用TraversableOnce.toMap.但是,如果结果地图"将包含矛盾",即分配给同一个键的不同值,我想要失败.就像在序列中一样("a" -> 1, "a" -> 2).但是应该允许重复.
目前我有这个(非常迫切的)代码:
def buildMap[A,B](in: TraversableOnce[(A,B)]): Option[Map[A,B]] = {
  val map = new HashMap[A,B]
  val it = in.toIterator
  var fail = false
  while(it.hasNext){
    val next = it.next()
    val old = map.put(next._1, next._2)
    fail = old.isDefined && old.get != next._2
  }
  if(fail) None else Some(map.toMap)
}
Run Code Online (Sandbox Code Playgroud)
决赛toMap真的有必要吗?省略它时会出现类型错误,但我认为它应该有效.实现toMap构建一个我想避免的新地图.
这个问题的动机是在Scala中使用PRNG,但答案很可能与语言无关.
我想为我的PRNG提供一个功能界面.目前我所知道的PRNG实现(Java stdlib,Scala stdlib,commons math)是OO,因为PRNG是一个具有可变状态的对象.但我更喜欢纯粹的功能性PRNG,它主要有以下方法:
def nextInt(state: S): (Int,S)
Run Code Online (Sandbox Code Playgroud)
这里S是PRNG的内部状态(称为种子或其他),该方法返回所需的随机值加上修改后的状态.
最好是一个实现.但我可以自己轻松地做到这一点.使用Java内置PRNG的一个非常简单的实现是:
def nextInt(state: Int): (Int,Int) = {
  val rng = new Random(state)
  (rng.nextInt(),rng.next())
}
Run Code Online (Sandbox Code Playgroud)
或者更危险,更少浪费
def nextInt(state: Random): (Int, Random) = {
  val newRng = state.clone
  (newRng.nextInt(),newRng)
}
Run Code Online (Sandbox Code Playgroud)
我真正需要的是PRNG算法,具有良好的质量,小的状态和快速的计算.Mersenne Twister的状态为600多字节.请注意,必须在每个步骤中复制状态.那么,有更小的东西吗?
是否有某种PRNG算法的比较?
当我通过SBT在Jenkins中运行我的Specs2测试时,一旦测试失败,构建就会被标记为失败.由于Jenkins通常区分构建失败和测试失败,我想改变这一点.
我知道Jenkins的构建失败是由对SBT的调用的退出代码检测到的,一旦至少一个测试失败,它就会返回1.
有什么选择我假设我想避免改变我build.sbt(或一般的项目)只是为了解决这个不便?
不知何故,我认为应该可以将标准的sbt项目放入标准的Jenkins安装中并使其按预期工作.
以下代码无法编译:
var next: (A, A) = (null, n)
Run Code Online (Sandbox Code Playgroud)
错误:
error: type mismatch;
found   : Null(null)
required: A
var next: (A, A) = (null, n)
Run Code Online (Sandbox Code Playgroud)
也var next: (A, A) = ((null: A), n)失败了同样的错误.
不知怎的,我认为它应该编译.
我目前正在使用以下代码,它似乎有效:
var next: (A, A) = (null.asInstanceOf[A], n)
Run Code Online (Sandbox Code Playgroud)
为什么不起作用?错误或功能?
阅读didiers之后回答问题很明显.我错过了null只能分配给AnyRef类型.对于我的问题,我选择制作元组(n,n)并使用布尔标志,无论第一个条目是否有效.根据应用程序Option可能是更好的解决方案.