我最近遇到了这个问题并找到了解决方案,但我想知道是否有更好的(或者只是更惯用的)解决方案。
我有一个颜色的结构:
data Rgb = Rgb Double Double Double
还有一个函数我想将颜色分量单独传递给,实际上来自开罗:
setSourceRGB :: Double -> Double -> Double -> Render ()
所以我需要以某种方式“解包”这个数据结构,因为setSourceRGB
不需要Rgb
. 我找到了两种方法。一种是定义一个函数来应用 a 的内容Rgb
:
applyRgb :: (Double -> Double -> Double -> t) -> Rgb -> t
applyRgb f (Rgb r g b) = f r g b
然后我可以这样做:
applyRgb setSourceRGB rgb
我想出的另一种方法是使用 case 执行内联 lambda 表达式,这意味着我不必定义单独的函数:
(\z -> (case z of (Rgb r g b) -> setSourceRGB r g b)) rgb
然而,我对此并不完全满意,以某种方式应用一个函数来传递一些值似乎并不正确。我希望能够把它转过来,Rgb
并将setSourceRGB
. 不幸的是,在我看来这是不可能的功能
fromRgb :: Rgb -> Double -> Double -> Double
可以传递给setSourceRGB
. 也许applyRgb
是最好的解决方案,但我想知道是否有更好的方法可以让我将其表达为:
setSourceRGB (fromRgb rgb)