Búsqueda de sitios web

scala - Nombre estándar de un tipo suma como Either pero para 3 casos?


¿Existe un tipo de suma estándar como Either pero para 3 casos? Haskell tiene These pero no es exactamente eso.

Respuesta #1

Creo que depender en exceso de tipos como este es un anti-patrón.

Una de las cosas más agradables que obtienes al usar tipos de datos algebraicos es que el tipo resultante te dice algo sobre el dominio con el que estás trabajando. Con un tipo genérico como Choice<T1, T2, T3>, realmente no estás diciendo nada sobre el dominio.

Creo que option<T> (también conocido como Maybe) es bastante claro en que indica que un valor de tipo T está presente o falta por alguna razón. Creo que Either<'T, exn> sigue siendo bastante claro en que indica que obtienes un valor o una excepción. Sin embargo, cuando tienes más de dos casos, se vuelve bastante difícil entender qué significan los casos, por lo que definir explícitamente un tipo con nombres que coincidan con el dominio podría ser una buena idea.

(Ocasionalmente uso Choice<T1, T2, T3> en F#, pero el uso generalmente se limita a un alcance pequeño - menos de 50 líneas de código - para que pueda encontrar fácilmente cuál es el significado en el entorno del código que lo consume.)

Respuesta #2

Estos se llaman coproductos, realmente un Either es simplemente un coproducto de 2 argumentos. Puedes usar auxiliares de la biblioteca shapeless para construir coproductos de longitud arbitraria usando:

type CP = Int :+: String :+: Boolean :+: CNil

val example = Coproduct[CP]("foo")

Luego puedes usar toda la divertida magia de poly para mapearlos o realizar otras operaciones:

object printer extends Poly1 {
  implicit def caseInt = at[Int](i => i -> s"$i is an int")
  implicit def caseString = at[String](s => s -> s"$s is a string")
  implicit def caseBoolean = at[Boolean](b => s -> s"$b is a bool")
}
val mapped = example map printer
mapped.select[(String, String)] shouldEqual "foo is a string"

Scala.JS + Shapeless pueden trabajar juntos hasta donde yo sé, así que eso puede darte lo que quieres.

Artículos relacionados