Hace poco encontré este problema y encontré una solución, pero me pregunto si hay soluciones mejores (o simplemente más idiomáticas).Cómo "descomprimir" una estructura en haskell
tengo una estructura para un color:
data Rgb = Rgb Double Double Double
y hay una función que me gustaría pasar a los componentes de color de forma individual, en realidad de El Cairo:
setSourceRGB :: Double -> Double -> Double -> Render()
Así que necesito para "descomprimir" esta estructura de datos de alguna manera, ya que setSourceRGB
no toma un Rgb
. Encontré dos maneras. Uno de ellos es definir una función para aplicar el contenido de un Rgb
:
applyRgb :: (Double -> Double -> Double -> t) -> Rgb -> t
applyRgb f (Rgb r g b) = f r g b
Entonces puedo hacer:
applyRgb setSourceRGB rgb
Otra forma que se me ocurrió es hacer una expresión en línea lambda con un caso, lo que significa que no tiene que definir una función separada:
(\z -> (case z of (Rgb r g b) -> setSourceRGB r g b)) rgb
sin embargo no estoy completamente contento con esto, de alguna manera la aplicación de una función sólo para pasar algunos valores no me parece bien. Me gustaría poder darle la vuelta, y "convertir" el Rgb
al tipo correcto para setSourceRGB
. Por desgracia, me parece que eso es imposible tener una función
fromRgb :: Rgb -> Double -> Double -> Double
que se puede pasar a setSourceRGB
. Tal vez applyRgb
es la mejor solución, pero me pregunto si hay alguna manera mejor que me permita expresar como:
setSourceRGB (fromRgb rgb)
¿Qué pasa con el 'case .. of'? '(\ (Rgb r g b) -> SetSource r g b) rgb' – ephemient