2010-04-19 72 views
0

可能有人请告诉我为什么下面的函数需要整数[],而不是字节[]为什么这个F#函数需要[],而不是字节数组的整数

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 

回答

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[]) = 
    // ... 
+0

很好的解释从的作家最好的f#书。 thanx :) – 2010-04-19 17:02:12

+0

@accidental coder:谢谢(对于这两个赞美)! – 2010-04-19 18:38:27

相关问题