【问题标题】:How to map over function's input in Scala?如何在Scala中映射函数的输入?
【发布时间】: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


    【解决方案1】:

    case Eff(eff: IO[E, Unit]) 中的IO 来自哪里?

    如果我将IO 定义为case class IO[+X, -Y](),则以下代码将编译:

      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[B, A, V, E](fn).andThen(rr)
      }
    

    【讨论】:

    • 很有趣,我明白了 - 这是来自 ZIO 库,所以我认为在我的情况下它应该是 IO[+E, +A],因为 EA 可能来自 @ 987654329@ 值。
    猜你喜欢
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2020-01-05
    • 2017-08-02
    相关资源
    最近更新 更多