有没有人对akka-camel vs scalaz-camel-akka做过评价?我喜欢scalaz带来的功能方法,并且稍微使用了scalaz-camel-akka,但还没有真正使用过akka-camel.
我会对某些比较点非常感兴趣.
给定以下PersonSQL 和模型代码:
SQL
CREATE TYPE sex AS ENUM ('male', 'female');
CREATE TABLE person (
id bigserial primary key,
name varchar(100) NOT NULL,
age integer NOT NULL,
gender sex NOT NULL );
Run Code Online (Sandbox Code Playgroud)
代码
object Person {
sealed trait Gender
case object Male extends Gender
case object Female extends Gender
// credit to Travis Brown: http://stackoverflow.com/a/30946172/409976
implicit val GenderShows: Show[Gender] = Show.shows {
case Male => "male"
case Female => "female"
}
}
case class Person private(id: Option[Long], name: String, …Run Code Online (Sandbox Code Playgroud) 这是我上一个问题的后续行动
我们可以定义一个函数,该函数按路径查找XML节点,(List[String], XmlNode) => Option[XmlNode]作为(String, XmlNode) => Option[XmlNode]按名称获取子节点的函数组合.
我们使用函数A => M[A],其中M是monad,形成a monoid,因此我们可以轻松地组合它们.
现在我想知道是否还有其他有趣的组成这些函数的例子.
我做了一个简单的例子来尝试将scalaz 库代码与 Apache Spark 1.5集成。
这是一个简单的 Spark 程序来说明我的问题:
package test
import org.apache.spark.{ SparkConf, SparkContext }
import org.apache.spark.rdd.RDD
import ca.crim.deti.re.spark.sparkConf
import scalaz._
import scalaz.Scalaz._
object TestSpark {
def main(args: Array[String]) = {
val conf = new SparkConf().setAppName("Test").setMaster("local")
val SC = new SparkContext(conf)
val c = SC.parallelize(List(1, 2, 3, 4, 5))
println(func1(c).count) // WORKS
println(func2(c).count) // DOES NOT WORK.. NotSerializableException
}
// WORKS!
def func1(rdd: RDD[Int]) = {
rdd.filter { i => f(i, i) }
}
// DOES NOT WORK! …Run Code Online (Sandbox Code Playgroud) 对于我的项目,我进行了测试,并在我的 sbt 构建中进行了测试。为了运行测试,我输入 sbt test,然后输入 it:test。build.sbt 中是否有一种方法可以将 test 和 it:test 结合起来,以便我的所有测试都在一个命令中执行?
从 2017 年有关 nanopass 编译器的演讲 ( https://github.com/sellout/recursion-scheme-talk/blob/master/nanopass-compiler-talk.org ) 中,我找到了下面的代码片段。在这段代码片段中,我看到两个通用约束,我已经上下搜索以理解它们,但无法找到有关它们的任何信息。我希望了解的是:
\nfinal case class Let[A](bindings: List[(String, A)], body: A)\nfinal case class If[A](test: A, consequent: A, alt: A)\n\ndef expandLet[Lambda :<: F]: Fix[Let :+: F] => Fix[F] =\n _.unFix match {\n case Let(bindings, body) =>\n bindings.unzip((names, exprs) =>\n Fix(App(Fix(Lam(names, expandLet(body)).inject),\n exprs.map(expandLet)).inject))\n // and don\xe2\x80\x99t forget the other cases\n }\n\ndef expandIf[Lambda :<: F]: Fix[If :+: F] => Fix[F] =\n _.unFix match {\n case If(test, …Run Code Online (Sandbox Code Playgroud) scala higher-kinded-types scalaz scala-cats recursion-schemes
当我使用Scalaz进行编码时,我经常遇到问题,范围内没有隐含的内容.我认为在大量的软件包scalaz中应该存在一些默认的含义,但要么我不知道哪里有没有.
假设我们想要show任何Anyscalaz(我使用scalaz 7):
scala> import scalaz._
import scalaz._
scala> import Scalaz._
import Scalaz._
scala> {def a: Any = "sratatata"; a}.show
<console>:14: error: could not find implicit value for parameter F0: scalaz.Show[Any]
{def a: Any = "sratatata"; a}.show
^
Run Code Online (Sandbox Code Playgroud)
这是行不通的Show[Any],因为范围没有隐含.
为什么Scalaz不提供它?使用某些全球性的好方法是Show[A]什么?我的意思是这样的:
scala> implicit def anyShow[A] = Show.showFromToString[A]
anyShow: [A]=> scalaz.Show[A]
scala> {def a: Any = "sratatata"; a}.show
res0: scalaz.Cord = sratatata
Run Code Online (Sandbox Code Playgroud)
我觉得同样的感觉Equal.
编辑
我已经尝试在添加的答案中提到,import scalaz.syntax.ShowSyntax但这并不能解决我的问题.看到:
scala> import scalaz._
import …Run Code Online (Sandbox Code Playgroud) 如果我有一个简单的scala List[A](即scala.collection.immutable.List),我有一些状态monad State[S,B].我想使用Scalaz的专业traverseSala:
val stuff: scala.collection.immutable.List[Int] = List(1,2,3)
val state: State[S,A]
stuff.traverseS(i => modify { ... })
Run Code Online (Sandbox Code Playgroud)
我需要导入什么才能转换scala.collection.immutable.List为Scalaz List?我找不到通过GitHub搜索,我无法让它尝试导入全权委托.也许我错过了一些明显的东西.
谢谢你的帮助.
我想做这样的事情:
def or[A](x: Option[A], y: Option[A]) = x match {
case None => y
case _ => x
}
Run Code Online (Sandbox Code Playgroud)
这样做的惯用方法是什么?我能想到的最好的是Seq(x, y).flatten.headOption
我有下一个代码
val listOption: List[Option[Int]] = List(1.some, none, 2.some)
Run Code Online (Sandbox Code Playgroud)
我想折叠元素,我写下一个代码
val result = listx.fold(0.some)((acc, el) => {
(acc, el) match {
case (Some(a), Some(b)) => Some(a + b)
case (Some(a), _) => Some(a)
case (_, Some(b)) => Some(b)
case _ => el
}
})
println(result.getOrElse(0)) // => 3
Run Code Online (Sandbox Code Playgroud)
这工作得很好,但我在scalaz来源中看到下一个三重奏
val composeFold = Foldable[List] compose Foldable[Option]
composeFold.fold(listOption) // => 3
Run Code Online (Sandbox Code Playgroud)
但我不明白它是如何正确的工作,以及为什么scalaz不将这些方法混合到listOption实例中,以及scala fold和scalaz 之间的区别fold
scala ×10
scalaz ×10
scalaz7 ×2
akka ×1
apache-camel ×1
apache-spark ×1
kleisli ×1
sbt ×1
scala-cats ×1
scala-option ×1
scalatest ×1
sql ×1