2016-08-12 2 views
1

Я хочу использовать абстрактный тип Value, ограниченный принадлежностью к типу класса Show от cats.Использование абстрактных типов с классами типов в Scala

Моя первая попытка будет что-то вроде:

package examples 
import cats._ 
import cats.data._ 
import cats.implicits._ 

class UsingShow1 { 
    type Value <: Show[Value] // Not sure if this declaration is right 

    def showValues(vs: List[Value]): String = 
    vs.map(implicitly[Show[Value]].show(_)).mkString // Error line 

} 

Но компилятор не находит неявный параметр Show[Value].

Я знаю, что я могу определить предыдущий пример:

class UsingShow2[Value: Show] { 
    def showValues(vs: List[Value]): String = 
    vs.map(implicitly[Show[Value]].show(_)).mkString 
} 

Однако, я хотел бы знать, если это возможно, использовать абстрактные типы вместо параметров типа.

ответ

5

Просто добавьте неявный параметр типа Show[Value], при использовании сайта, как обычно:

class UsingShow1 { 
    type Value 
    def showValues(values: List[Value])(implicit showValue: Show[Value]): String = 
    values.map(showValue.show).mkString 
} 

Но более прямой перевод вашего UsingShow2 класс будет следующим:

class UsingShow1 { 
    type Value 
    implicit def showValue: Show[Value] 

    def showValues(values: List[Value]): String = 
    values.map(showValue.show).mkString 
} 

В основном, так как вы торгуете своим типом параметрValue для аннотация типа члена, вам также необходимо обменять неявный параметр для неявного аннотация член (showValue в моем примере).

+0

Спасибо, второй стиль - это то, что я искал. Я хотел бы выразить ограничение на 'Show' для' Value' в объявлении абстрактного типа с использованием одной строки. Во всяком случае, добавление 'implicit def showValue: Show [Value]' тоже в порядке. – Labra

Смежные вопросы