当我第一次看到下面这段代码时,我很困惑.
在Element类中,有三个函数定义.
为什么高度和宽度可以直接使用内容作为Array [String]的变量?
是因为Scala中的每个函数都是一个对象或其他规则吗?
我来自C++世界,所以这个定义真的让我困惑.
abstract class Element {
def contents: Array[String]
def height: Int = contents.length
def width: Int = if (height == 0) 0 else contents(0).length
}
Run Code Online (Sandbox Code Playgroud) 我试图找出在Scala中声明函数时def和之间的区别var/val.
假设我们有一个功能:
scala> def f(x: Int) = { x * 2 }
f: (x: Int)Int
Run Code Online (Sandbox Code Playgroud)
另一个功能g:
scala> var g = (x:Int) => x*2
g: Int => Int = <function1>
Run Code Online (Sandbox Code Playgroud)
显然它们在以下方面是相同的:
scala> f(2)
res0: Int = 4
scala> g(2)
res1: Int = 4
Run Code Online (Sandbox Code Playgroud)
但是,我能做到
g = f
g: Int => Int = <function1>
Run Code Online (Sandbox Code Playgroud)
但不是
scala> f = g
<console>:13: error: missing arguments for method f;
follow this method with `_' if you want to treat it as …Run Code Online (Sandbox Code Playgroud) 我是斯卡拉新手,我认为它是一种非常丰富的语言.让我抓住语法的一件事就是功能创建.我知道大括号{}被编译器解释为在许多上下文中与括号()同义,但以下我仍然不太明白.
以下是Scala REPL的输出:
scala> def index = List {}
index: List[Unit]
scala> def index = List ()
index: List[Nothing]
Run Code Online (Sandbox Code Playgroud)
Q1.
如果我正确地理解了上述内容,我正在创建一个名为的函数index,它创建一个新的List(new由于对apply方法的隐式调用而被省略?).
我看到Unit(相当于null在Java中?)是使用大括号{}时的列表类型.但是使用parens()时没有什么类型.
Q2.
有人可以用简单的术语(如果可能的话)解释使用{}和()创建函数之间的区别以及Nothing代表什么?
编辑 - 所以以下是等价的?
def index = List {val a = 1; a}
def index = List ({val a = 1; a})
Run Code Online (Sandbox Code Playgroud)
我也在与术语的位置有点挣扎function,method似乎可以互换使用.
说上述两者都可以被认为是a function还是method?是正确的吗?或者它取决于你与谁交谈?
假设我们有以下功能:
def first(a: A): B = ???
def second(b: B): C = ???
Run Code Online (Sandbox Code Playgroud)
我想用 来组合它们andThen,但是下面的代码:
(first andThen second)(a)
Run Code Online (Sandbox Code Playgroud)
结果是:
<console>:14: error: missing argument list for method first
Unapplied methods are only converted to functions when a function type is expected.
You can make this conversion explicit by writing `first _` or `first(_)` instead of `first`.
(first andThen second) (1)
Run Code Online (Sandbox Code Playgroud) 无法读取 REPL 返回的以下类型
def returnfuncdefGen[A] = (i: A) => i.toString.length
returnfuncdefGen: [A]=> A => Int
Run Code Online (Sandbox Code Playgroud)
虽然我明白
def returnfuncdefGen[A](i: A) = i.toString.length
returnfuncdefGen: [A](i: A)Int
Run Code Online (Sandbox Code Playgroud)
第一个版本是FP的作者简化(scala)调用coercing parameterize方法到函数中
人们究竟如何阅读这个[A]=> A => Int?
我也觉得强制的概念有点奇怪。对我来说,这就像创建一个返回函数的无括号方法。现在顶部的泛型我无法通过说文字函数执行方法定义的类型的闭包来解释其他。
总的来说,如果有人可以向我澄清正在发生的事情以及如何阅读该类型 [A]=> A => Int,那真的会有所帮助。
有两种方法可以定义函数.
scala> def a : (Int, Int) => Int = {(s:Int, t:Int) => s + t}
a: (Int, Int) => Int
scala> a
res15: (Int, Int) => Int = <function2>
scala> def b(s:Int, t:Int) : Int = s+t
b: (s: Int, t: Int)Int
scala> b
<console>:9: error: missing arguments for method b in object $iw;
follow this method with `_' if you want to treat it as a partially applied function
b
^
scala> b(3,4)
res17: Int …Run Code Online (Sandbox Code Playgroud) 新手在这里.我遇到了以下这段代码
class A
class B extends A
val printB: B => Unit = { b => println("Blah blah") }
Run Code Online (Sandbox Code Playgroud)
有人可以解释这个printB功能吗?我无法理解是什么b,因为它没有在任何地方定义.
我有以下函数,它做递归:
@tailrec
private def pool[F[_]: Monad, A]
: Consumer[String, String] => (Vector[KkConsumerRecord] => F[A]) => IO[Unit]
= consumer => cb => {
val records: ConsumerRecords[String, String] = consumer.poll(Long.MaxValue)
val converted = records.iterator().asScala.map(rec => {
KkConsumerRecord(rec.key(), rec.value(), rec.offset(), rec.partition(), rec.topic())
})
val vec = converted.foldLeft(Vector.empty[KkConsumerRecord]) { (b, a) =>
a +: b
}
cb(vec)
pool(consumer)(cb)
}
Run Code Online (Sandbox Code Playgroud)
编译器抱怨:
[error] /home/developer/Desktop/microservices/bary/kafka-api/src/main/scala/io/khinkali/Consumer/KkConsumer.scala:57:10: type mismatch;
[error] found : org.apache.kafka.clients.consumer.Consumer[String,String]
[error] required: cats.Monad[?]
[error] pool(consumer)(cb)
[error] ^
[error] two errors found
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
为什么以下代码片段中的f给出值1.我应该f()是1.如何获得对函数的引用f:()=> Int
var y = 0
def f():Int = {y + 1}
f
Run Code Online (Sandbox Code Playgroud)
斯卡拉的事情让我疯狂.
scala> def nextOption = if (util.Random.nextInt > 0) Some(1) else None
nextOption: Option[Int]
scala> nextOption
res1: Option[Int] = Some(1)
scala> nextOption
res3: Option[Int] = None
Run Code Online (Sandbox Code Playgroud)
尝试学习scala,上面执行的代码有几个问题:
1. nextOption 定义的正确部分是否考虑了函数字面量?
2. 如果它是使用 'val' 关键字而不是 'def' 定义的,那会改变吗?
3. 为什么 nextOption 类型是 Option[Int] 而不是函数?( ()=>Option[Int] )
4. 给这段代码添加括号或括号会改变它的类型/值吗?
5. nextOption 和类似 '() => if (......) some(1) Else None' 有什么区别
scala中有这样的函数连接吗?
我记得在Haskell点"." 可以连接两个功能.
我想实现
def f1(a:String) = a.toInt
def f2(a:Int) = a + 1
def f3 = f1 . f2
f3("123")
Run Code Online (Sandbox Code Playgroud) Scala Tour Of Scala 文档以 whileLoop 函数为例解释了按名称传递的参数。
def whileLoop(condition: => Boolean)(body: => Unit): Unit =
if (condition) {
body
whileLoop(condition)(body)
}
var i = 2
whileLoop (i > 0) {
println(i)
i -= 1
} // prints 2 1
Run Code Online (Sandbox Code Playgroud)
该部分解释了如果不满足条件,则不会评估主体,从而通过不评估未使用的代码主体来提高性能。
Scala 的实现是否while已经使用了按名称传递的参数?
如果有原因或特定情况导致实现无法使用按名称传递参数,请向我解释,到目前为止我还没有找到任何相关信息。
编辑:根据 Valy Dia(/sf/users/407844461/)的回答,我想添加另一个问题......
如果在某些情况下可能根本不评估主体,while 语句的方法实现是否会比语句本身性能更好?如果是这样,为什么要使用 while 语句呢?
我将尝试对此进行测试,但我是 Scala 的新手,因此可能需要一些时间。如果有人愿意解释,那就太好了。
干杯!
我正在阅读 Odersky 的“Scala Programming”一书,他提到如果 Scala 中的表达式因返回值而不同,但根据我的经验,如果使用命令式语言(如 Java)中的语句也会发生同样的情况?那么是什么让 if 表达式与 Java 的 if 语句不同呢?
scala ×13
function ×2
apache-kafka ×1
composition ×1
java ×1
methods ×1
pass-by-name ×1
scala-cats ×1
while-loop ×1