【发布时间】:2021-08-19 02:54:28
【问题描述】:
我正在尝试创建一个map,它可以将函数的输入类型转换为另一种类型。通常我们映射时,我们有一个函数A => B,但是由于我们是在函数中映射输入,我相信这意味着我们实际上需要一个函数B => A,如下所示:
enum Result[+V, +E, +A]:
case View(view: V)
case Eff(eff: IO[E, Unit])
case Res(result: A, remaining: Unit => Any)
object Result {
def map[A,B,V,E](fn: A => B)(res: Result[V,E,A]): Result[V,E,B] = res match {
case View(v) => View(v)
case Eff(e) => Eff(e)
case Res(res, rem) => Res(fn(res), rem)
}
}
type ResultRun[V,E,A] = Result[V, E, A] => IO[E, Unit]
object ResultRun {
// f: A -> C
// fn: B -> A
// fn andThen f : B -> C
def map[V,E,A,B](fn: B => A)(rr: ResultRun[V,E,A]): ResultRun[V,E,B] = Result.map(fn).andThen(rr)
}
这会导致以下类型错误,这可能表明我做错了比错误所指示的更根本的错误:
[error] 50 | def map[V,E,A,B](fn: B => A)(rr: ResultRun[V,E,A]): ResultRun[V,E,B] = Result.map(fn).andThen(rr)
[error] | ^^
[error] |Found: (rr : concur.Types.ResultRun[V, E, A])
[error] |Required: concur.Types.Result[Any, Any, A] => IO[E, Unit]
[error] |
[error] |One of the following imports might make progress towards fixing the problem:
[error] |
[error] | import scalajs.js.Any.fromFunction1
[error] | import scalajs.js.ThisFunction.fromFunction1
另外,也许这应该称为contraMap,而不是map。
【问题讨论】:
标签: scala functional-programming scala-3