考虑这个功能:
mix : Color -> Color -> Color
mix c1 c2 =
let
{ red, green, blue, alpha } = toRgb c1
{ red, green, blue, alpha } = toRgb c2
in
...
以上操作无效,因为它引入了重复的变量名称.是否有可能将上述值解构为r1,r2,g1,g2等?
为了澄清,toRgb有这个签名:
toRgb : Color -> { red:Int, green:Int, blue:Int, alpha:Float }
假设的语法可能更好地表达了我想要做的事情:
mix : Color -> Color -> Color
mix c1 c2 =
let
{ red as r1, green as g1, blue as b1, alpha as a1 } = toRgb c1
{ red as r2, green as g2, blue as b2, alpha as a2 } = toRgb c2
in
...
最佳答案 我无法弄清楚这是否可能并且意识到现场存取器是如此强大以至于无关紧要.
大概你的代码可能看起来像:
mix : Color -> Color -> Color
mix c1 c2 =
{ red = avg c1.red c2.red
, green = avg c1.green c2.green
, blue = avg c1.blue c2.blue
, alpha = avg c1.alpha c2.alpha
}
没那么可怕或不可读.但是,你甚至可以这样做:
mix : Color -> Color -> Color
mix c1 c2 =
{ red = avg .red c1 c2
, green = avg .green c1 c2
, blue = avg .blue c1 c2
, alpha = avg .alpha c1 c2
}
那些更糟糕的是:
mix : Color -> Color -> Color
mix c1 c2 =
let
{ red1, green1, blue1, alpha1 } = toRgb c1
{ red2, green2, blue2, alpha2 } = toRgb c2
in
{ red = avg red1 red2
, green = avg green1 green2
, blue = avg blue1 blue2
, alpha = avg alpha1 alpha2
}