【问题标题】:Scala Either with List斯卡拉要么与列表
【发布时间】:2018-12-07 10:49:17
【问题描述】:

我想实现一个与Either 类型类似的类型,称为Result。主要区别在于,Result 类型的左侧应该始终是某物的列表。什么是正确的类型定义?我尝试过这样的事情:

sealed trait Result[List, +A] {
    def map[B](f: A => B): Result[List, B] = this match {
        case Failure(err) => Failure(err)
        case Success(value) => Success(f(value))
    }
    def apply[B](f: Result[List, A => B]): Result[List, B] = (f, this) match {
        case (Failure(fE), Failure(aE)) => Failure(fE ::: aE)
        case ...
    }
}

final case class Failure[+E](errors: List[E]) extends Result[List[E], Nothing]
final case class Success[+A](value: A) extends Result[Nothing, A]

但这会在映射函数中出现错误,即 Failure[Any] does not equal Result[List, B]Success[B] does not equal Result[List, B]。类型定义 Result[List, +A] 是否已经错误,我应该改用 List[_] 之类的更高种类的类型吗?

【问题讨论】:

    标签: scala types either higher-kinded-types


    【解决方案1】:

    如果您希望左侧是始终 List 的某物,则无需对 List 进行抽象。摘要超过E

    sealed trait Result[+E, +A] {
        def map[B](f: A => B): Result[E, B] = this match {
            case Failure(err) => Failure(err)
            case Success(value) => Success(f(value))
        }
        def apply[B, F >: E](f: Result[F, A => B]): Result[F, B] = (f, this) match {
            case (Failure(fE), Failure(aE)) => Failure(fE ::: aE)
            case (Failure(fE), _) => Failure(fE)
            case (_, Failure(aE)) => Failure(aE)
            case (Success(fS), Success(tS)) => Success(fS(tS))
        }
    }
    
    case class Failure[+E](errors: List[E]) extends Result[E, Nothing]
    case class Success[+A](value: A) extends Result[Nothing, A]
    

    请注意,您似乎正在从 Scalaz/Cats 重新发明一些标准的 Applicatives。

    【讨论】:

    • 我仍然得到同样的错误说失败[任何]不等于铁路[E,B],如果我想实现某种应用功能,我需要列表属性。我会更新我的问题来解释一下
    • @Lando-L 上面的代码肯定可以编译。我已经更新了apply 部分。我的猜测是你对方差注释做错了。
    • 我不知道我做错了什么,我以为我有完全相同的代码。谢谢!
    • @Lando-L 我认为在某处List 之前缺少+。现在可以用了吗?
    猜你喜欢
    • 2015-06-28
    • 2011-09-16
    • 2011-12-29
    • 2011-07-15
    • 1970-01-01
    • 2011-03-13
    • 2020-08-07
    • 2016-03-21
    • 2012-05-16
    相关资源
    最近更新 更多