Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 将方法从伴生对象移动到类时类型不匹配_Scala - Fatal编程技术网

Scala 将方法从伴生对象移动到类时类型不匹配

Scala 将方法从伴生对象移动到类时类型不匹配,scala,Scala,我是Scala的新手,所以答案可能是显而易见的 在Scala中查看FP时,我注意到unit方法放在伴生对象上,而不是类上,因此我尝试将其移动到类中。 这导致了一个我不理解的错误,有人能给我解释一下吗 当您在类上取消对unit方法的注释并在伴生对象上注释掉它时,会导致以下错误: 为什么呢 import State._ case class State[S, A](run: S => (A, S)) { def map[B](f: A => B): State[S, B] =

我是Scala的新手,所以答案可能是显而易见的

在Scala中查看FP时,我注意到
unit
方法放在伴生对象上,而不是类上,因此我尝试将其移动到类中。 这导致了一个我不理解的错误,有人能给我解释一下吗

当您在类上取消对
unit
方法的注释并在伴生对象上注释掉它时,会导致以下错误:

为什么呢

import State._

case class State[S, A](run: S => (A, S)) {
  def map[B](f: A => B): State[S, B] =
    flatMap(a => unit(f(a)))

  def map2[B, C](sb: State[S, B])(f: (A, B) => C): State[S, C] =
    flatMap(a => sb.map(b => f(a, b)))

  def flatMap[B](f: A => State[S, B]): State[S, B] = State(s => {
    val (a, s1) = run(s)
    f(a).run(s1)
  })

  // This results in an error here:
  //     flatMap(a => unit(f(a))) ... Required A, found B
  // def unit(a: A): State[S, A] = State(s => (a, s)) // ERROR
}

object State {
  // Comment out when uncommenting above
  def unit[S, A](a: A): State[S, A] = State(s => (a, s))
}

这个错误解释了问题,但这里是故障

映射开始

def map[B](f: A => B): State[S, B] =
  flatMap(a => unit(f(a)))
由于
f
返回一个未知类型
B
,因此这是使用类型
B
的值调用
unit
。但是
单元
被定义为采用
A
,这是
案例类的类型参数

def unit(a: A): State[S, A] = State(s => (a, s))
由于
B
可能不是
A
,编译器会抱怨


伴生对象内的代码不同:

object State {
  def unit[T, U](a: U): State[T, U] = State(s => (a, s))
}
我重新命名了类型参数,以明确它们现在与case类的类型参数无关。由于
unit
的参数类型可以是任何类型的
U
,因此可以将
B
类型的值传递给它


要修复
案例类
单元
的定义,请为其指定一个类型参数:

case class State[S, A](run: S => (A, S)) {
   // ...

   def unit[T](a: T): State[S, T] = State(s => (a, s))
}

这个错误解释了问题,但这里是故障

映射开始

def map[B](f: A => B): State[S, B] =
  flatMap(a => unit(f(a)))
由于
f
返回一个未知类型
B
,因此这是使用类型
B
的值调用
unit
。但是
单元
被定义为采用
A
,这是
案例类的类型参数

def unit(a: A): State[S, A] = State(s => (a, s))
由于
B
可能不是
A
,编译器会抱怨


伴生对象内的代码不同:

object State {
  def unit[T, U](a: U): State[T, U] = State(s => (a, s))
}
我重新命名了类型参数,以明确它们现在与case类的类型参数无关。由于
unit
的参数类型可以是任何类型的
U
,因此可以将
B
类型的值传递给它


要修复
案例类
单元
的定义,请为其指定一个类型参数:

case class State[S, A](run: S => (A, S)) {
   // ...

   def unit[T](a: T): State[S, T] = State(s => (a, s))
}

为什么要将
unit
从对象移动到类?类
State
封装了一个函数
S=>(a,S)
因此
map
map2
flatMap
在类内部是有意义的,因为它们使用类
State
运行
。但是
单元
没有(它是“静态的”)。因此,将
unit
从对象移动到类似乎是一个奇怪的决定。如何调用它(如果您还没有类
State
的实例)?谢谢@DmytroMitin,这很有意义!为什么要将
unit
从对象移动到类?类
State
封装了一个函数
S=>(a,S)
因此
map
map2
flatMap
在类内部是有意义的,因为它们使用类
State
运行
。但是
单元
没有(它是“静态的”)。因此,将
unit
从对象移动到类似乎是一个奇怪的决定。如何调用它(如果您还没有类
State
的实例)?谢谢@DmytroMitin,这很有意义!非常感谢。现在很明显!作为一个新手,我混淆了同伴对象和类中的相同字母:)谢谢!现在很明显!作为一个新手,我混淆了同伴对象和类中的相同字母:)