私は最近この問題に遭遇し、解決策を見つけましたが、より良い(またはより慣用的な)解決策があるかどうか疑問に思っています。
私は色の構造を持っています:
data Rgb = Rgb Double Double Double
そして、実際にはカイロから、色成分を個別に渡したい関数があります。
setSourceRGB :: Double -> Double -> Double -> Render ()
setSourceRGB
したがって、をとらないので、このデータ構造を何らかの方法で「解凍」する必要がありRgb
ます。私は2つの方法を見つけました。Rgb
1つは、 :の内容を適用する関数を定義することです。
applyRgb :: (Double -> Double -> Double -> t) -> Rgb -> t
applyRgb f (Rgb r g b) = f r g b
それから私はすることができます:
applyRgb setSourceRGB rgb
私が思いついたもう1つの方法は、ケースを使用してインラインラムダ式を実行することです。これは、別の関数を定義する必要がないことを意味します。
(\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)