假设我有以下元组:
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?我真的在寻找一个结合任意大小的元组的一般答案,并意识到由于最大元组大小的上限会有限制.我特意寻找一个元组结果,而不是一个集合.
在我看来,Scalaz' NonEmptyList有一个monad实例,所以应该有一个monad变换器(有点类似ListT).那是对的吗?
如果是的话,那里有一个吗?(我在Scalaz 7中找不到一个.)
如果没有,即monad变压器是不可能的或没有任何意义,我将不胜感激任何其他解释为什么不.
我猜测必须有更好的功能方式来表达以下内容:
def foo(i: Any) : Int
if (foo(a) < foo(b)) a else b
Run Code Online (Sandbox Code Playgroud)
所以在这个例子f == foo和p == _ < _.对于scalaz来说,必然会有一些熟练的聪明才智!我可以看到使用BooleanW我可以写:
p(f(a), f(b)).option(a).getOrElse(b)
Run Code Online (Sandbox Code Playgroud)
但我确信我能够编写一些只引用a和b一次的代码.如果这存在,它必须是某种组合Function1W和其他东西,但scalaz对我来说有点神秘!
编辑:我想我在这里问的不是"我怎么写这个?" 但是"这个功能的正确名称和签名是什么?它与FP的东西有什么关系,我还不知道像Kleisli,Comonad等?"
我试图找出如何使用基于对我的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) 我认为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)不包括在内.没有包含某些东西的原因是什么?
我想使用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专家有什么想法吗?
我有一个不可变的数据结构,我在地图中有嵌套值,如下所示:
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) 我听说迭代是懒惰的,但他们究竟有多懒?或者,迭代可以与后处理函数融合,以便不必构建中间数据结构吗?
我可以在我的iteratee中例如Stream[Option[String]] 从ajava.io.BufferedReader构建一个100万个项目,然后None以组合方式过滤掉s,而不需要将整个Stream保存在内存中吗?同时保证我不会砸堆栈?或类似的东西 - 它不必使用Stream.
我目前正在使用Scalaz 6,但如果其他迭代实现能够以更好的方式执行此操作,我有兴趣知道.
请提供完整的解决方案,包括关闭BufferedReader和致电unsafePerformIO(如果适用).
我正在使用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)
任何帮助表示赞赏
我的所有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会发生什么?