Есть ли способ определить несколько неявных доказательств с помощью одного HList? - PullRequest
1 голос
/ 09 ноября 2019

У меня есть фрагмент кода, концептуально похожий на следующий:

//library code
trait Support[K, V]

def partialHandler[K, V](key: K, value: V)(implicit ev: Support[K, V]) = ???

//user code
implicit val intIntSupport = new Support[Int, Int] {}
implicit val intStringSupport = new Support[Int, String] {}
...

partialHandler(1, "foo)
partialHandler(1, 1)

Интересно, есть ли способ позволить пользователям этой библиотеки более элегантно определять поддерживаемые типы (K, V), например:

val supportedTypes = new Support[Int, Int] {} :: new Support[Int, String] {} :: HNil

(По сути, я ищу неявное преобразование из довольно неизвестного HList в Support[K, V]. Это не выглядит выполнимым, но, возможно, я что-то упустил.)

1 Ответ

1 голос
/ 10 ноября 2019

Попробуй сделать supportedTypes неявным

import shapeless.ops.hlist.Selector
import shapeless.{HList, HNil}

// library code
trait Support[K, V]

object Support {
  implicit def mkSupport[L <: HList, K, V](implicit l: L, sel: Selector[L, Support[K, V]]): Support[K, V] = null
}

def partialHandler[K, V](key: K, value: V)(implicit ev: Support[K, V]) = ???

//user code
implicit val supportedTypes = new Support[Int, Int] {} :: new Support[Int, String] {} :: new Support[Long, Double] {} :: HNil

partialHandler(1, "foo")
partialHandler(1, 1)
partialHandler(1L, 1.0)
// partialHandler("foo", "bar") // doesn't compile
...