Почему эта функция f # ожидает целое число [] вместо байтового массива - PullRequest
0 голосов
/ 19 апреля 2010

Может кто-нибудь показать мне, почему функция ниже ожидает целое число [] вместо байта []

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 Ответ

6 голосов
/ 19 апреля 2010

Единственное место, которое сообщает компилятору F # о типе параметра, находится внутри лямбда-функции, заданной для Array.iter (при использовании этой функции более высокого порядка компилятор делает вывод, что вы работаете с массивами) , Внутри лямбда-функции у вас есть:

leafNodes.[(int)b] 

Как примечание, int в этом коде - это просто обычная функция F # (не специальная конструкция приведения типа), поэтому обычный способ написать ее будет просто:

leafNodes.[int b] 

Теперь компилятор знает, что b (то есть значения массива, заданного в качестве аргумента) можно преобразовать в целое число, однако функция int работает с другими типами (вы можете написать, например, int 3.13f В неоднозначных случаях, подобных этому, компилятор использует int в качестве типа по умолчанию, поэтому по этой причине вы видите тип int[].

Вы можете добавить аннотации типов в объявление следующим образом (и оно будет работать без каких-либо других изменений, поскольку byte можно преобразовать в целое число с помощью функции int):

let createNodes (inputValues:byte[]) =  
  // ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...