我有个问题:
C中有这样一种方法:
inline void ColorSet(int face, int pos,int col)
{
color[face*9+pos]=col;
}
我试图用F#编写它;
type ColorSet =
member this.ColorSet (face: int, pos: int, col: int) =
color.[face*9+pos] = col
但是我遇到了这样的错误:
根据该程序点之前的信息,运算符
'expr.[idx]'
已用于不确定类型的对象。考虑添加其他类型约束...您能帮我写出确切的方法吗?
最佳答案
阅读评论,看来您可能正在尝试这样做:
let itemCount = 9
let faceCount = 6
let color : int [] = Array.zeroCreate (faceCount * itemCount)
let setColor face pos col =
color.[face * itemCount + pos] <- col
有两件事要注意:
不确定类型错误的对象通常可以通过类型注释来解决:通过将
color
声明为: int []
,可以指定color必须是整数数组运算符
=
是F#中是否相等的测试。要分配给可变变量或数组组件,请使用<-
。用法可能如下所示:
let red = 0xFFFF0000 // Assuming ARGB (machine endianness)
setColor 0 8 red // Set the last component of the first face to red
请注意,这对于F#是不寻常的样式。我确实使用这样的代码,但前提是已知它对性能至关重要,并且编译器无法对其进行优化。通常,您将使用一种颜色类型,例如System.Drawing.Color(用于兼容性),以及通过
face
参数迭代的对象的类型。编辑您是否将6个面的骰子或长方体的颜色存储在阵列中?以防万一有人感兴趣,我会假设这一点,并写出它在更典型的F#中的外观。我不知道这是否相关,但是我想添加它不会有什么坏处。
/// A color, represented as an int. Format, from most to least
/// significant byte: alpha, red, green, blue
type Color = Color of int
let black = Color 0xFF000000
let red = Color 0xFFFF0000
type CubeColors =
{ Top : Color; Bottom : Color
Left : Color; Right : Color
Front : Color; Back : Color }
/// Creates CubeColors where all faces have the same color
static member Uniform c =
{ Top=c; Bottom=c; Left=c
Right=c; Front=c; Back=c }
// Make an array with nine completely black cubes
let cubes = Array.create 9 (CubeColors.Uniform black)
// Change the top of the second cube to red
cubes.[1] <- { cubes.[1] with Top = red }
对于
Color
类型,使用单写字母discriminated union;对于CubeColors
类型,使用record。与执行低级数组操作相比,此方法使用起来更安全,并且通常更具可读性。