Recentemente mi sono imbattuto in questo problema e ho trovato una soluzione, ma mi chiedo se ci siano soluzioni migliori (o solo più idiomatiche).Come "decomprimere" una struttura in haskell
Ho una struttura per un colore:
data Rgb = Rgb Double Double Double
e non v'è una funzione che vorrei passare i componenti di colore a individualmente, in realtà dal Cairo:
setSourceRGB :: Double -> Double -> Double -> Render()
Quindi ho bisogno per "decomprimere" questa struttura dati in qualche modo, dal momento che setSourceRGB
non accetta uno Rgb
. Ho trovato due modi. Uno è quello di definire una funzione di applicare il contenuto di un Rgb
:
applyRgb :: (Double -> Double -> Double -> t) -> Rgb -> t
applyRgb f (Rgb r g b) = f r g b
Allora posso fare:
applyRgb setSourceRGB rgb
Un altro modo mi è venuto in mente è di fare un'espressione in linea lambda con un caso, il che significa che non c'è bisogno di definire una funzione separata:
(\z -> (case z of (Rgb r g b) -> setSourceRGB r g b)) rgb
io non sono del tutto soddisfatto di questo però, in qualche modo l'applicazione di una funzione solo per passare alcuni valori non mi sembra giusto. Mi piacerebbe essere in grado di capovolgerlo e "convertire" il Rgb
nel tipo giusto per setSourceRGB
. Purtroppo mi sembra che è tutto impossibile avere una funzione
fromRgb :: Rgb -> Double -> Double -> Double
che può essere passato a setSourceRGB
. Forse applyRgb
è la soluzione migliore, ma mi chiedo se c'è un modo migliore che vi permetterà di esprimere come:
setSourceRGB (fromRgb rgb)
Che cos'è il "caso .. di'? '(\ (Rgb r g b) -> SetSource r g b) rgb' – ephemient