Gần đây tôi đã gặp vấn đề này và tìm thấy một giải pháp nhưng tôi tự hỏi nếu có tốt hơn (hoặc chỉ là thành ngữ) các giải pháp.Làm thế nào để "giải nén" một cấu trúc trong haskell
Tôi có một cấu trúc cho một màu sắc:
data Rgb = Rgb Double Double Double
Và có một chức năng tôi muốn vượt qua các thành phần màu sắc cho cá nhân, thực sự từ Cairo:
setSourceRGB :: Double -> Double -> Double -> Render()
Vì vậy, tôi cần để "giải nén" cấu trúc dữ liệu này bằng cách nào đó, vì setSourceRGB
không mất Rgb
. Tôi tìm thấy hai cách. Một là để xác định một chức năng để áp dụng các nội dung của một Rgb
:
applyRgb :: (Double -> Double -> Double -> t) -> Rgb -> t
applyRgb f (Rgb r g b) = f r g b
Sau đó, tôi có thể làm:
applyRgb setSourceRGB rgb
Một cách khác tôi đã đưa ra là để làm một biểu thức inline lambda với một trường hợp, có nghĩa là tôi không cần phải xác định một chức năng riêng biệt:
(\z -> (case z of (Rgb r g b) -> setSourceRGB r g b)) rgb
tôi không hoàn toàn hài lòng với điều này tuy nhiên, bằng cách nào đó áp dụng một chức năng chỉ để vượt qua một số giá trị có vẻ không đúng. Tôi muốn có thể biến nó xung quanh và "chuyển đổi" Rgb
thành loại phù hợp cho setSourceRGB
. Rất tiếc, có vẻ như tôi không thể có chức năng
fromRgb :: Rgb -> Double -> Double -> Double
có thể được chuyển đến setSourceRGB
. Có lẽ applyRgb
sự là giải pháp tốt nhất, nhưng tôi tự hỏi nếu có một cách nào đó tốt hơn mà sẽ cho phép tôi thể hiện nó như:
setSourceRGB (fromRgb rgb)
Điều gì xảy ra với 'trường hợp .. của'? '(\ (Rgb r g b) -> SetSource r g b) rgb' – ephemient