如何组合返回Validations的两个函数?以下是我的尝试不起作用:
scala> def f: Int => Validation[String, Int] = i => if(i % 2 == 0) Success(i * 2) else Failure("Odd!")
f: Int => scalaz.Validation[String,Int]
scala> def g: Int => Validation[String, Int] = i => if(i > 0) Success(i + 1) else Failure("Not positive!")
g: Int => scalaz.Validation[String,Int]
scala> kleisli(f) >=> kleisli(g)
<console>:16: error: no type parameters for method kleisli: (f: A => M[B])scalaz.Kleisli[M,A,B] exist so that it can be applied to arguments (Int => scalaz.Validation[String,Int])
--- because ---
argument …Run Code Online (Sandbox Code Playgroud) 我scalaz |>想在切换功能和对象时使用操作符,这样可以获得更多的可读性.我来介绍一个模型函数:
def length2(x:String) = x.length * 2Run Code Online (Sandbox Code Playgroud) 现在,我可以用两种方式编写它:"aoeu" |> length2
length2("aoeu")Run Code Online (Sandbox Code Playgroud)
但是,如果我将此函数定义为更通用,它将停止工作.def length2(x:SeqLike[_,_]) = x.length * 2
length2("aoeu") // ok
"aoeu" |> length2 // doesn't workRun Code Online (Sandbox Code Playgroud)
为什么编译器不理解这个?肯定有一种隐含的转换,从String某种类混合到特质中SeqLike. 我经常发现自己想要(然后通常编写)Scalaz类型的类实例用于其他Scala或Java库中的类.举几个例子:
Shapeless的一个monoid实例为HList你提供了monoid实例,用于几乎免费提供适当类型成员的case类.
对于适用函子例如电梯的Box允许您例如测序箱列表:
scala> val boxen: List[Box[Int]] = Full(1) :: Full(2) :: Full(3) :: Nil
boxen: List[net.liftweb.common.Box[Int]] = List(Full(1), Full(2), Full(3))
scala> boxen.sequence
res0: net.liftweb.common.Box[List[Int]] = Full(List(1, 2, 3))
Run Code Online (Sandbox Code Playgroud)
对于单子例如派遣0.9的Promise(和Promise[Either[Throwable, _]]等)是对各种事情巨大有用.
一个适用函子实例为标准库的Parser品牌应用性解析更加简洁和优雅.(我只是注意到Scalaz 7 现在提供了一个monad实例Parser.)
等等...
这些实例几乎总是非常通用的,我相信很多人已经写了很多次.我正在捕获的这个问题是Scalaz类型类实例的某种聚合器或交换所.我不确定这样的事情是否存在 - 我当然无法找到类似的东西 - 但即使只是一组链接到博客文章,GitHub存储库或其他资源对我也很有用.
我更喜欢Scalaz 7实例,但我会采取任何我能得到的.
我有两个相同类型的实例化案例类.
case class Foo(x : Option[String], y : Option[String], z : Option[String])
Run Code Online (Sandbox Code Playgroud)
让我们调用实例化的类A和B.
val a = Foo(x=Some("foo"), y=Some("bar"), z=Some("baz"))
val b = Foo(x=None, y=Some("etch"), z=None)
Run Code Online (Sandbox Code Playgroud)
我想知道是否可以通过一般操作在单个操作中用B更新案例类A.
val c = b *oper* a // produces Foo(x=Some("foo"), y=Some("etch"), z=Some("baz"))
Run Code Online (Sandbox Code Playgroud)
参数设置为无忽略.理想情况下,操作也应该是通用的,因此它可以作用于任何类型的案例类.
我有一些直觉,可以通过先将类转换为元组/列表并在操作完成后转换回类来使用Scalaz来实现这一点 - 也许使用ApplicativeBuilder?我是否以正确的方式思考这个问题?有任何想法吗?
我在寻找它利用单子(和类群可能)更广泛的解决方案,实现同
if( xs.contains(None) ) None else Some(xs.flatten)做的xs类型Seq[Option[A]].
我怎么能用Scalaz做到这一点?我觉得我错过了一些明显的东西.
我在项目中使用scalaz7,有时我会遇到导入问题.最简单的方法是开始
import scalaz._
import Scalaz._
Run Code Online (Sandbox Code Playgroud)
但有时这会导致冲突.到目前为止我一直在做的事情是下面一个有点痛苦的过程:
-Xprint:typer以找出隐式解析后代码的外观虽然这有效,但我想简化它.我看到scalaz7有更多细粒度的导入,但我不完全了解它们的组织方式.例如,我看到一个人可以做到
import scalaz.std.option._
import scalaz.std.AllInstances._
import scalaz.std.AllFunctions._
import scalaz.syntax.monad._
import scalaz.syntax.all._
import scalaz.syntax.std.boolean._
import scalaz.syntax.std.all._
Run Code Online (Sandbox Code Playgroud)
等等.
这些子进口是如何组织的?
举个例子,假设我想使用验证.我需要什么,例如注入验证含义并进行以下编译?
3.fail[String]
Run Code Online (Sandbox Code Playgroud)
如何制作ValidationNEL[A, B]一个实例Applicative?
这个问题是关于Scala的隐式解析系统的局限性,我在使用Scalaz时遇到过几次,这对我来说没有多大意义.我已将问题提炼到下面的Scalaz-less版本,但如果需要,我很乐意提供有关动机的更多信息.
假设我有几个类型类见证了类型构造函数:
import scala.language.higherKinds
trait Foo[F[_]]
trait Bar[F[_], A]
Run Code Online (Sandbox Code Playgroud)
现在也假设如果我有一个Foo实例F,我知道我也有一个Foo实例Bar[F, _]:
implicit def barFoo[F[_]: Foo] = new Foo[({type L[X] = Bar[F, X]})#L] {}
Run Code Online (Sandbox Code Playgroud)
我也有实例List和右边Either:
implicit object listFoo extends Foo[List]
implicit def eitherFoo[A] = new Foo[({type L[X] = Either[A, X]})#L] {}
Run Code Online (Sandbox Code Playgroud)
现在很明显我应该能够编写以下内容:
type BarList[X] = Bar[List, X]
implicitly[Foo[BarList]]
Run Code Online (Sandbox Code Playgroud)
或者,等效地:
implicitly[Foo[({type L[X] = Bar[List, X]})#L]]
Run Code Online (Sandbox Code Playgroud)
事实上,两者都完全符合预期.
所以我尝试以下方法:
type StringOr[X] = Either[String, X]
type BarStringOr[X] = Bar[StringOr, X]
Run Code Online (Sandbox Code Playgroud)
然后:
scala> implicitly[Foo[BarStringOr]] …Run Code Online (Sandbox Code Playgroud) 在Scala中,为了读取文本文件并将其上传到数组中,常见的方法是
scala.io.Source.fromFile("file.txt").getLines.toArray
Run Code Online (Sandbox Code Playgroud)
特别是对于非常大的文件,是否有更快的方法可能首先将字节块读入内存然后用新行字符拆分它们?(有关常用方法,请参阅Scala中的读取整个文件.)
非常感谢.
"透镜"和"部分透镜"在名称和概念上看起来相似.他们有什么不同?在什么情况下我需要使用其中一个?
标记Scala和Haskell,但我欢迎与任何具有镜头库的功能语言相关的解释.
在2013 年的这个问题中,奥德斯基先生指出,"现在判断"像Scalaz这样的图书馆是否能够在Dotty下存在(至少在他们当前的状态下),这是由于高级和存在类型的阉割所致.
在过去的时间里,Dotty对Scalaz&Cats的影响已被阐明了吗?内置效果和记录等提议的功能是否会改变这些项目的范围?
我知道Dotty仍然可以替代scalac,但是当我考虑投入时间将纯粹的功能结构和方法应用到我的工作中时,我认为考虑其旗舰库的未来很重要.