相关疑难解决方法(0)

在scala中,使用函数名作为返回值?

当我第一次看到下面这段代码时,我很困惑.

在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

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

在Scala中使用def或var声明一个函数

我试图找出在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

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

SCALA创建函数语法

我是斯卡拉新手,我认为它是一种非常丰富的语言.让我抓住语法的一件事就是功能创建.我知道大括号{}被编译器解释为在许多上下文中与括号()同义,但以下我仍然不太明白.

以下是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?是正确的吗?或者它取决于你与谁交谈?

scala function

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

函数组合导致首先缺少方法的参数列表

假设我们有以下功能:

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)

functional-programming scala composition

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

将参数化方法强制转换为函数时,Scala 奇怪的类型?

无法读取 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,那真的会有所帮助。

methods scala

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

不同地定义Scala函数

可能重复:
Scala中方法和函数之间的差异在Scala
中定义函数的两种方法.有什么不同?

有两种方法可以定义函数.

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)

scala function

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

有人可以解释这段代码吗?

新手在这里.我遇到了以下这段代码

class A
class B extends A
val printB: B => Unit = { b => println("Blah blah") }
Run Code Online (Sandbox Code Playgroud)

有人可以解释这个printB功能吗?我无法理解是什么b,因为它没有在任何地方定义.

scala

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

类型不匹配cats.Monad [?]?

我有以下函数,它做递归:

  @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)

我究竟做错了什么?

scala apache-kafka scala-cats

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

Scala函数定义与应用程序

为什么以下代码片段中的f给出值1.我应该f()是1.如何获得对函数的引用f:()=> Int

var y = 0
def f():Int = {y + 1}

f
Run Code Online (Sandbox Code Playgroud)

斯卡拉的事情让我疯狂.

scala

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

Scala - 函数定义和没有参数的函数文字之间的区别

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

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

scala中的函数连接

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)

functional-programming scala

0
推荐指数
1
解决办法
700
查看次数

是否已经使用按名称传递参数实现了 while 循环?: 斯卡拉

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 的新手,因此可能需要一些时间。如果有人愿意解释,那就太好了。

干杯!

functional-programming scala while-loop pass-by-name

0
推荐指数
1
解决办法
131
查看次数

Scala 中的 if 表达式与 Java 等命令式语言的 if 语句有何不同?

我正在阅读 Odersky 的“Scala Programming”一书,他提到如果 Scala 中的表达式因返回值而不同,但根据我的经验,如果使用命令式语言(如 Java)中的语句也会发生同样的情况?那么是什么让 if 表达式与 Java 的 if 语句不同呢?

java scala

0
推荐指数
1
解决办法
103
查看次数