【问题标题】:Scala abstract type alias meet type class in method ParamsScala抽象类型别名在方法Params中遇到类型类
【发布时间】:2014-04-11 09:50:10
【问题描述】:

我尝试将 Scala 类型类和抽象类型别名组合在一起,但这给我带来了一些问题。
查看代码: 我有一个ModelService

trait ModelService[T] {
  type ID
  def save(t: T): ID
  def find(id: ID): T
}

object ModelService {

  implicit object UserService extends ModelService[User] {
    type ID = Long
    def save(t: User): ID = ???
    def find(id: ID): User = ???
  }

}

我使用类型类来实现:

object ModelHelpers {

  def save[T](model: T)(implicit service: ModelService[T]): service.ID =
    service.save(model)

  def find[T: ModelService](id:) = // here, how can I declare the id's type?
    implicitly[ModelService[T]].find(id)
}

问题是:在ModelHelpers.save中,我可以使用service.ID声明返回类型

但是在ModelHelpers.find中,如何声明参数id的类型呢?

谢谢。

【问题讨论】:

    标签: scala typeclass type-alias


    【解决方案1】:

    例如:

    type User = String
    
    trait ModelService[T] {
      type ID
      def save(t: T): ID
      def find(id: ID): T
    }
    
    object ModelService {
      implicit object UserService extends ModelService[User] {
        type ID = Long
        def save(t: User): ID = t.toLong
        def find(id: ID): User = id.toString
      }
    }
    
    object ModelHelpers {
      def save[T](model: T)(implicit service: ModelService[T]): service.ID = service save model
      def find[ID0, T](id: ID0)(implicit service: ModelService[T] { type ID = ID0 }): T = service find id
    }
    
    ModelHelpers find 5L // "5": User
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多