2010-04-19 111 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

相關問題