有人可以告诉我为什么下面的函数需要整数[]而不是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
答案 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[]) =
// ...