【发布时间】:2009-12-20 00:28:00
【问题描述】:
我最近遇到了这个问题并找到了解决方案,但我想知道是否有更好(或更惯用的)解决方案。
我有一个颜色的结构:
data Rgb = Rgb Double Double Double
还有一个函数我想单独传递颜色分量,实际上来自开罗:
setSourceRGB :: Double -> Double -> Double -> Render ()
所以我需要以某种方式“解包”这个数据结构,因为setSourceRGB 不需要Rgb。我找到了两种方法。一种是定义一个函数来应用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)
【问题讨论】:
-
case .. of是怎么回事?(\(Rgb r g b) -> SetSource r g b) rgb