为什么这个f#函数需要一个整数[]而不是字节数组

时间:2010-04-19 16:18:17

标签: f#

有人可以告诉我为什么下面的函数需要整数[]而不是byte []

type Node =
    | InternalNode of int*Node*Node
    | LeafNode of int * byte

let weight node =
    match node with 
    |InternalNode(w,_,_) -> w
    |LeafNode(w,_)-> w

let createNodes inputValues =
    let getCounts (leafNodes:(int*byte)[])= 
        inputValues |>Array.iter
            (fun b-> let (w,v) =leafNodes.[(int)b]
                     leafNodes.[(int)b]<-(w+1,v))

        leafNodes
    [|for b in 0uy..255uy -> (0 ,b)|] |>getCounts
    |>List.ofArray
    |>List.map LeafNode

1 个答案:

答案 0 :(得分:6)

告诉F#编译器关于参数类型的一些内容是在给Array.iter的lambda函数内部(使用这个高阶函数,编译器推断你正在使用阵列)。在lambda函数中你有:

leafNodes.[(int)b] 

作为旁注,此代码中的int只是一个普通的F#函数(不是特殊的类型转换构造),所以通常的编写方式就是:

leafNodes.[int b] 

现在,编译器知道b(即,作为参数给出的数组的值)可以转换为整数,但int函数可以与其他类型一起使用(您可以编写为示例int 3.13f。在这种模棱两可的情况下,编译器使用int作为默认类型,这就是您看到类型int[]的原因。

您可以像这样在声明中添加类型注释(并且它可以在没有任何其他更改的情况下工作,因为byte可以使用int函数转换为整数):

let createNodes (inputValues:byte[]) =  
  // ...