我正在学习Scala,在下面的代码中使用flatMap (摘自99个Scala问题)
现在我完全搞不懂“ms”和“e”是什么了?如果我把ms改成dd,我得到的错误是“没有找到值ms”。如果我将鼠标悬停在它们上面,我会得到一个工具提示,告诉我'ms‘是一个'List’,而'e‘是'Any’。
我试着在谷歌上搜索"Scala List element ms和e“或者"Scala flatMap ms和e”或者"Scala中的ms和e是什么意思?“但我似乎找不到任何东西来解释这些“ms”和“e”是什么。
它们是关键词吗?在Scala文档中,我
看看Haskell的Either Monad,有一个>>=函数。
Prelude Map> let add100 = \x -> Right (x+100 :: Int)
Prelude Map> x
Right 5
Prelude Map> x >>= add100
Right 105
Prelude Map> let y = Left "..." :: Either String Int
Prelude Map> y >>= add100
Left "..."
然而,为什么Scala
我是Scala的新手,我正在为的不耐烦研究Scala。在我开始理解之前,它一直进行得很顺利,并遇到了这个略带神秘意味的段落(第2.6节,高级循环和理解):
起始报价
生成的集合与第一个生成器兼容。
for (c <- "Hello"; i <- 0 to 1) yield (c + i).toChar
// Yields "HIeflmlmop"
for (i <- 0 to 1; c <- "Hello") yield (c + i).toChar
// Yields Vector('H',
我试图理解map和flatMap是如何工作的,但被下面的代码卡住了。flatMap()函数返回一个RDDChar,但我期望返回的是RDDString。有人能解释一下为什么它会产生RDDChar吗?
scala> val inputRDD = sc.parallelize(Array(Array("This is Spark"), Array("It is a processing language"),Array("Very fast"),Array("Memory operations")))
scala> val
我正在尝试从OptionString中提取aid和event_type,提取这些值的最佳scala方法是什么,如果没有,则输出为null。
val payload = Some({"event":"testApi",
"data":[{"aid":"test","pr":"{\"id\":\"813da0e5-d9aa-4275-b9d4-5e84362b73bb\",\"event_type\":\"promo app loa
与Haskell的sequence函数的scala类似是什么?
sequence在Haskell中的定义如下:
sequence :: Monad m => [m a] -> m [a]
sequence ms = foldr k (return []) ms
where
k m m' = do { x <- m; xs <- m'; return (x:xs) }
以下是一些用法:
ghci> sequence [Just 1, Just 2, Nothing, Just 3]
Nothing
在听的收藏品讲座时,我看到了这个例子:
scala> val s = "Hello World"
scala> s.flatMap(c => ("." + c)) // prepend each element with a period
res5: String = .H.e.l.l.o. .W.o.r.l.d
然后,我很好奇为什么奥德斯基先生在这里不使用map。但是,当我尝试地图时,我得到了一个与我预期不同的结果。
scala> s.map(c => ("." + c))
res8: scala.collect
我有以下scala代码(来自Scala书中的FP ):
import scala.{Option => _, Either => _, Left => _, Right => _, _} // hide std library `Option` and `Either`, since we are writing our own in this chapter
case class Left[+E](get: E) extends Either[E,Nothing]
case class Right[+A](get: A) extends Either[Nothing
用Scala编写以下内容的最佳方法是什么?在我看来,这不太正确--首先是2 vals的前向声明,然后是长的PrintWriter创建行,然后是finally块。唯一惯用的是catch块..。
val outputStream = Try(fs.create(tmpFile))
val writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(outputStream.get)))
if (outputStream.isFailure) {
logger.error(s"Couldn't open
我在Scala中有以下模式匹配代码: response.flatMap(employee =>
employee match {
case e if e.type == Manager => e.headoffice
case e if e.type == Clerk => e.branch
case _ => None
}
) 这是进行模式匹配的最佳方式吗?它能更简洁吗?
我想要有一个二元运算符cross (叉积/笛卡尔积),它可以在Scala中操作遍历:
val x = Seq(1, 2)
val y = List('hello', 'world', 'bye')
val z = x cross y # i can chain as many traversables e.g. x cross y cross w etc
assert z == ((1, 'hello'), (1, 'world'), (1, 'bye'), (2, 'hello
我正在浏览scala以解决急躁的问题,并遇到了一个我似乎无法理解的多条件循环的例子。
来自Java背景,我将这些循环看作嵌套的for循环。但是为什么第一个返回一个collection,第二个返回一个String
scala> for (i <- 0 to 1; c <- "Hello") yield (i + c).toChar
res11: scala.collection.immutable.IndexedSeq[Char] = Vector(H, e, l, l, o, I, f, m, m, p)
scala> for (c <-
为了理解,我把顺序换成了两行看似独立的台词.第一个给出预期的结果,而第二个抛出异常。为什么会发生这种情况?
scala> for (a <- 1 to 3; b <- Some(2)) yield (a, b);
res6: scala.collection.immutable.IndexedSeq[(Int, Int)] = Vector((1,2),
(2,2), (3,2))
scala> for (b <- Some(2); a <- 1 to 3) yield (a, b);
<console>:12: error: type mi
Scala中用于处理场景的模式是什么:
你有很多未来(它们可以是什么,但为了举例.)
val aF = Future { true }
val bF = Future { Option(3) }
val cF = Future { myObject }
你有一些函数可以返回未来
def fooF: Future[SomeObject]
我想做这样的事情:
for {
a <- aF
b <- bF
c <- cF
} yield {
if (a) {
// do stuff with b & c
fooF
当我写的时候
println(List[String Either Int](Left("Boom"), Right(42)).flatten)
编译器抱怨说
ScalaFiddle.scala:16: error: No implicit view available from Either[String,scala.this.Int] => collection.this.GenTraversableOnce[B].
println(List[String Either Int](Left("Boom"), Right(42)).flatten)
我希望看到正在地图/平面地图中传递的f函数,但是没有运气。我抛出了一个异常,看到任何f的迹象,没有工作。那是什么功能?它是如何在幕后产生的?
Exception in thread "main" java.lang.RuntimeException
at x.x.Main$A.getInt(Empty.scala:8)
at x.x.Main$A.flatMap(Empty.scala:10)
object Main extends App {
class A {
def getInt: Int = throw new RuntimeExceptio
我面对的是flatMap的错误,而不是map的错误。flatMap转换不支持布尔操作吗?
scala> val array = Array("age","astro")
array: Array[String] = Array(age, astro)
scala> val baseRdd = sc.parallelize(array)
baseRdd: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[0] at parallelize at <console>:29
s