标签: scalaz

一个干净的方法将两个元组组合成一个新的scala中更大的元组?

假设我有以下元组:

scala> val t1 = Tuple2("abcd", "efg")
t1: (java.lang.String, java.lang.String) = (abcd,efg)

scala> val t2 = Tuple2(1234, "lmnop")
t2: (Int, java.lang.String) = (1234,lmnop)

scala> val t3 = Tuple3("qrs", "tuv", "wxyz")
t3: (java.lang.String, java.lang.String, java.lang.String) = (qrs,tuv,wxyz)
Run Code Online (Sandbox Code Playgroud)

是否有一种友好的方式将它们(必要时分两步)组合成一个Tuple7?我真的在寻找一个结合任意大小的元组的一般答案,并意识到由于最大元组大小的上限会有限制.我特意寻找一个元组结果,而不是一个集合.

scala scalaz

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

用于NonEmptyList的Monad变换器?

在我看来,Scalaz' NonEmptyList有一个monad实例,所以应该有一个monad变换器(有点类似ListT).那是对的吗?

如果是的话,那里有一个吗?(我在Scalaz 7中找不到一个.)

如果没有,即monad变压器是不可能的或没有任何意义,我将不胜感激任何其他解释为什么不.

monads scala monad-transformers scalaz

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

函数等价于if(p(f(a),f(b))a else b

我猜测必须有更好的功能方式来表达以下内容:

def foo(i: Any) : Int

if (foo(a) < foo(b)) a else b 
Run Code Online (Sandbox Code Playgroud)

所以在这个例子f == foop == _ < _.对于scalaz来说,必然会有一些熟练的聪明才智!我可以看到使用BooleanW我可以写:

p(f(a), f(b)).option(a).getOrElse(b)
Run Code Online (Sandbox Code Playgroud)

但我确信我能够编写一些只引用ab一次的代码.如果这存在,它必须是某种组合Function1W和其他东西,但scalaz对我来说有点神秘!

编辑:我想我在这里问的不是"我怎么写这个?" 但是"这个功能的正确名称和签名是什么?它与FP的东西有什么关系,我还不知道像Kleisli,Comonad等?"

functional-programming scala scalaz

14
推荐指数
2
解决办法
1028
查看次数

scalaz List [StateT] .sequence - 找不到参数n的隐式值:scalaz.Applicative

我试图找出如何使用基于对我的Scalaz状态monad示例答案的评论StateT来组合两个State状态变换器.

看起来我很亲密,但在尝试申请时遇到了问题sequence.

import scalaz._
import Scalaz._
import java.util.Random

val die = state[Random, Int](r => (r, r.nextInt(6) + 1))

val twoDice = for (d1 <- die; d2 <- die) yield (d1, d2)

def freqSum(dice: (Int, Int)) = state[Map[Int,Int], Int]{ freq =>
  val s = dice._1 + dice._2
  val tuple = s -> (freq.getOrElse(s, 0) + 1)
  (freq + tuple, s)
}

type StateMap[x] = State[Map[Int,Int], x]

val diceAndFreqSum = stateT[StateMap, Random, Int]{ random …
Run Code Online (Sandbox Code Playgroud)

scala state-monad monad-transformers scalaz

14
推荐指数
1
解决办法
1306
查看次数

Scala PartialFunction可以是Monoid吗?

我认为PartialFunction可以是Monoid.我的思维过程是否正确?例如,

import scalaz._
import scala.{PartialFunction => -->}

implicit def partialFunctionSemigroup[A,B]:Semigroup[A-->B] = new Semigroup[A-->B]{
  def append(s1: A-->B, s2: => A-->B): A-->B = s1.orElse(s2)
}

implicit def partialFunctionZero[A,B]:Zero[A-->B] = new Zero[A-->B]{
  val zero = new (A-->B){
    def isDefinedAt(a:A) = false
    def apply(a:A) = sys.error("error")
  }
}
Run Code Online (Sandbox Code Playgroud)

但目前的版本Scalaz(6.0.4)不包括在内.没有包含某些东西的原因是什么?

functional-programming scala partialfunction scalaz monoids

14
推荐指数
1
解决办法
1439
查看次数

撰写Scalaz验证

我想使用Scalaz进行验证,并希望能够在不同的上下文中重用验证函数.我对Scalaz btw完全不熟悉.

假设我有这些简单的检查:

def checkDefined(xs: Option[String]): Validation[String, String] =
  xs.map(_.success).getOrElse("empty".fail)

def nonEmpty(str: String): Validation[String, String] =
  if (str.nonEmpty) str.success else "empty".fail

def int(str: String): Validation[String, Int] = ...
Run Code Online (Sandbox Code Playgroud)

我希望能够组合验证,其中一个的输出被馈送到另一个.我可以很容易地用flatMap或通过理解,但感觉必须有一个更好的方式.

for {
  v1 <- checkDefined(map.get("foo"))
  v2 <- nonEmpty(v1)
  v3 <- int(v2)
  v4 <- ...
} yield SomeCaseClass(v3, v4)
Run Code Online (Sandbox Code Playgroud)

要么

val x1 = checkDefined(map get "foo").flatMap(nonEmpty).flatMap(int)
val x2 = check(...)

// How to combine x1 and x2?
Run Code Online (Sandbox Code Playgroud)

那里的Scalaz专家有什么想法吗?

scala scalaz

14
推荐指数
2
解决办法
4304
查看次数

避免使用镜头重复,同时深入复制到Map值

我有一个不可变的数据结构,我在地图中有嵌套值,如下所示:

case class TradingDay(syms: Map[String, SymDay] = Map.empty)
case class SymDay(sym: String, traders: Map[String, TraderSymDay] = Map.empty)
case class TraderSymDay(trader: String, sym: String, trades: List[Trade] = Nil)
Run Code Online (Sandbox Code Playgroud)

另外,我有一天中所有交易的清单,我想生成TradingDay结构,在哪里

case class Trade(sym: String, trader: String, qty: Int)
Run Code Online (Sandbox Code Playgroud)

我想通过折叠我的交易来弄清楚如何用镜头更新这个结构(见附录):

(TradingDay() /: trades) { (trd, d) =>
  def sym = trd.sym
  def trader = trd.trader
  import TradingDay._
  import SymDay._
  import TraderSymDay._
  val mod =
    for {
      _ <- (Syms member sym).mods(
             _ orElse some(SymDay(sym)))
      _ <- (Syms at sym andThen Traders …
Run Code Online (Sandbox Code Playgroud)

scala scalaz lenses

14
推荐指数
2
解决办法
963
查看次数

Scala中的Iteratees使用惰性求值或融合?

我听说迭代是懒惰的,但他们究竟有多懒?或者,迭代可以与后处理函数融合,以便不必构建中间数据结构吗?

我可以在我的iteratee中例如Stream[Option[String]] 从ajava.io.BufferedReader构建一个100万个项目,然后None以组合方式过滤掉s,而不需要将整个Stream保存在内存中吗?同时保证我不会砸堆栈?或类似的东西 - 它不必使用Stream.

我目前正在使用Scalaz 6,但如果其他迭代实现能够以更好的方式执行此操作,我有兴趣知道.

请提供完整的解决方案,包括关闭BufferedReader和致电unsafePerformIO(如果适用).

scala scalaz iterate

14
推荐指数
1
解决办法
961
查看次数

Scalaz验证:将验证序列转换为单个验证

我正在使用scalaz验证,并有一些代码来验证产品.

def validateProduct(product: Option[Product]): ValidationNel[String, Product] = ???
Run Code Online (Sandbox Code Playgroud)

给定一个产品列表,我希望得到一个包含整个列表的验证作为成功值或验证错误列表.似乎某种折叠应该这样做,但我不确定组合功能应该是什么.

 def validateProducts(products: Seq[Option[Product]]): ValidationNel[String, Seq[Product]] = {
    val listOfValidations: Seq[ValidationNel[String, Product]] = products.map(validateProduct _)
    val validatedList:ValidationNel[Seq[String], Seq[Product]] = ??? // what to do here?
    ???
  }
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏

validation scala scalaz

14
推荐指数
2
解决办法
2679
查看次数

我的API都返回Future [Option [T]],如何在for-compr中很好地结合它们

我的所有API方法都返回Future [Option [T]],试图找出如何优雅地执行以下操作:

case class UserProfile(user: User, location: Location, addresses: Address)
Run Code Online (Sandbox Code Playgroud)

以下代码目前无法编译,因为用户,位置和地址都是选项[用户],选项[位置]和选项[地址]

val up = for {
 user <- userService.getById(userId)
 location <- locationService.getById(locationId)
 address <- addressService.getById(addressId)
} yield UserProfile(user, location, address)
Run Code Online (Sandbox Code Playgroud)

我记得scalaz有OptionT,但我以前从未真正使用它,也不确定如何将它应用到我的情况中.

如果说用户,位置或地址实际上返回None,那么当我需要在这种情况下将它应用于3个模型时使用OptionT会发生什么?

scala scalaz

14
推荐指数
1
解决办法
575
查看次数