在f#中编写方法

时间:2014-12-24 13:39:49

标签: c f#

我有一个问题:

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]'已用于不确定类型的对象。考虑添加更多类型约束......

你能帮我写出确切的方法吗?

2 个答案:

答案 0 :(得分:3)

阅读评论,似乎您可能正在尝试这样做:

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 [],指定颜色必须是整数数组

  • 运算符=是对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。这比使用低级数组的东西更安全,并且通常更易读。

答案 1 :(得分:0)

您应该在类构造函数中的某处定义color。 例如,如果color是一个数组:

type ColorSet() =
    let color = Array.zeroCreate 100
    member this.ColorSet (face: int, pos: int, col: int) = 
        color.[face*9+pos] <- col