相关疑难解决方法(0)

通过Scalaz找到我的方式

可能重复:
好的scalaz介绍

我想了解更多有关Scalaz的信息,可能会使用Scalaz7来避免在声明稳定后重新布线.我的问题是Scalaz包含很多功能.虽然大部分内容都是独立于其他部分,但我希望能够全面了解Scalaz提供的全局功能以及它的组织方式.据我所知,Scalaz除其他外提供了

  • Functor,ApplicativeMonad特征,
  • 新的monad如Validation(编辑:原来它只是一个应用)
  • monad变形金刚(OptionT,EitherT....)
  • Itereatee小号
  • LensES
  • Zipper小号

除此之外还有很多隐式转换,以及新的构造函数,例如some与标准库重叠但在类型方面表现更好

:type Some(3) // Some[Int]
:type some(3) // Option[Int]
Run Code Online (Sandbox Code Playgroud)

我对大多数这些结构有基本的把握,但我对任何概念都不熟悉.

您对以何种顺序学习库有什么建议吗?模块之间存在哪些逻辑依赖关系?更一般地说,我在哪里可以找到图书馆的高级概述?

编辑似乎大多数答案都是针对学习函数式编程的基本组件,比如monad,所以我会尝试更精确.我有Haskell的基本知识和数学家背景,所以我的问题与类别理论或基本函数式编程无关.

我的问题是Scalaz是一个庞大的图书馆.我不知道在哪里找到什么,在各种数据类型上有哪些方法可用或有用.我真正需要的是一张地图,例如,它会告诉我,当我想要迭代需要处理的资源时,我可能想要考虑迭代以及我可以用它做什么样的操作.更像是图书馆可用功能的全景.

functional-programming scala scalaz scalaz7

24
推荐指数
4
解决办法
2162
查看次数

其他库的Scalaz类型实例的总结

我经常发现自己想要(然后通常编写)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.9Promise(和Promise[Either[Throwable, _]]等)是对各种事情巨大有用.

一个适用函子实例为标准库的Parser品牌应用性解析更加简洁和优雅.(我只是注意到Scalaz 7 现在提供了一个monad实例Parser.)

等等...

这些实例几乎总是非常通用的,我相信很多人已经写了很多次.我正在捕获的这个问题是Scalaz类型类实例的某种聚合器或交换所.我不确定这样的事情是否存在 - 我当然无法找到类似的东西 - 但即使只是一组链接到博客文章,GitHub存储库或其他资源对我也很有用.

我更喜欢Scalaz 7实例,但我会采取任何我能得到的.

java monads scala typeclass scalaz

13
推荐指数
1
解决办法
412
查看次数

在Scala中合并两个案例类,但是具有深层嵌套类型,没有镜头样板

类似于这个案例类问题,但有一个扭曲:

我有一个case类,它有一些深层嵌套的case类作为属性.举个简单的例子,

case class Foo(fooPropA:Option[String], fooPropB:Option[Int])
case class Bar(barPropA:String, barPropB:Int)
case class FooBar(name:Option[String], foo:Foo, optionFoo: Option[Foo], bar:Option[Bar])
Run Code Online (Sandbox Code Playgroud)

我想将两个FooBar案例类合并在一起,获取输入存在的值并将它们应用于现有实例,从而生成更新版本:

val fb1 = FooBar(Some("one"), Foo(Some("propA"), None), Some(Foo(Some("propA"), Some(3))), Some(Bar("propA", 4)))
val fb2 = FooBar(None, Foo(Some("updated"), Some(2)), Some(Foo(Some("baz"), None)), None)
val merged = fb1.merge(fb2)
//merged = FooBar(Some("one"), Foo(Some("updated"), Some(2)), Some(Foo(Some("baz"), Some(3))), Some(Bar("propA", 4)))
Run Code Online (Sandbox Code Playgroud)

我知道我可以使用镜头来构建深层嵌套的属性更新; 但是,我觉得这需要大量的锅炉板代码:我需要一个镜头用于每个属性,而另一个组合镜头在父类中.这似乎是一个很多维护,即使使用的更简洁的镜头创作方法不成形.

棘手的部分是optionFoo元素:在这种情况下,两个元素都存在Some(value).但是,我想合并内部选项属性,而不仅仅是用fb2的新值覆盖fb1.

我想知道是否有一种很好的方法可以将这两个值合并在一起,只需要最少的代码.我的直觉告诉我尝试使用unapplycase类上的方法返回一个元组,迭代并将元组组合成一个新的元组,然后将元组应用回case类.

有没有更有效的方法来做这件事?

scala lenses

13
推荐指数
2
解决办法
2483
查看次数

有效地序列化案例类

对于我正在处理的库,我需要提供一种有效,方便且类型安全的序列化scala类的方法.理想情况是,如果用户可以创建一个案例类,并且只要所有成员都是可序列化的,那么它应该也是如此.我确切地知道序列化和反序列化阶段的类型,因此不需要(并且不能承受)任何"模式"信息作为序列化格式的一部分(如Java对象序列化).

我一直在玩一些想法,这个似乎非常接近.我在这里看到的主要问题是用户如何指定类的"apply"和"unapply"功能.由于这些都是静态函数,我想知道是否有可能让编译器找到它.

这是一个自包含的例子:

trait InOut[T] {
  // just keeping things simple, for illustration purposes
  def toWire(x: T): Array[Byte]
  def fromWire(v: Array[Byte] ): T
}

object InOutConversions {
  // Pretend these are implemented properly

    implicit def Int = new InOut[Int] {
      def toWire(x: Int): Array[Byte] = Array[Byte]()
      def fromWire(v: Array[Byte] ): Int = 44
    }

    implicit def String = new InOut[String] {
      def toWire(x: String): Array[Byte] = Array[Byte]()
      def fromWire(v: Array[Byte] ): String = "blah"
    }

    // etc... for …
Run Code Online (Sandbox Code Playgroud)

serialization scala case-class

8
推荐指数
1
解决办法
3527
查看次数

无法在HList上映射

我试图用无形的方法来解决这个问题.但是我出于某种原因无法映射到HList.我会让代码说明一切.

import shapeless._
import HList._

case class Foo(a: Option[Int], b: Option[Int])

val a = Foo(Some(3), None)

val b = Foo(Some(22), Some(1))

implicit val fooIso = HListIso(Foo.apply _, Foo.unapply _)

val mapper = new (({ type O2[+A] = (Option[A], Option[A]) })#O2 ~> Option) {
  def apply[A](x: (Option[A], Option[A])): Option[A] = x._1.orElse(x._2)
}

fooIso.fromHList(fooIso.toHList(a).zip(fooIso.toHList(b)).map(mapper))
Run Code Online (Sandbox Code Playgroud)

错误信息是:

<console>:55: error: could not find implicit value for parameter mapper: shapeless.Mapper[java.lang.Object with shapeless.~>[[+A](Option[A], Option[A]),Option],shapeless.::[(Option[Int], Option[Int]),shapeless.::[(Option[Int], Option[Int]),shapeless.HNil]]]
              fooIso.fromHList(fooIso.toHList(a).zip(fooIso.toHList(b)).map(mapper))
                                                                           ^
Run Code Online (Sandbox Code Playgroud)

为什么映射不起作用?

type-systems scala shapeless

7
推荐指数
1
解决办法
965
查看次数

Scala:如何在元组的每个元素上调用trim

我需要编写一个函数,它接受任意大小的字符串元组,在每个元素上调用trim并返回一个新的元组.我有点陷在下面这一点,代码已经不是类型安全了.另外,一旦我将它转换为迭代器,我不知道如何回到元组.有没有更优雅的方法来解决这个问题?解决方案需要适用于Scala 2.9.2

  def trim(input:Product)={
    input.productIterator.asInstanceOf[Iterator[String]].map(_.trim)
  }
Run Code Online (Sandbox Code Playgroud)

scala tuples

6
推荐指数
1
解决办法
772
查看次数