Scala 将方法从伴生对象移动到类时类型不匹配
我是Scala的新手,所以答案可能是显而易见的 在Scala中查看FP时,我注意到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] =
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,这很有意义!非常感谢。现在很明显!作为一个新手,我混淆了同伴对象和类中的相同字母:)谢谢!现在很明显!作为一个新手,我混淆了同伴对象和类中的相同字母:)