ocaml Это выражение имеет тип 'список, но здесь используется с типом X (account) - PullRequest
1 голос
/ 18 мая 2011

есть часть ocaml, которая работает правильно

type position = {symbol: string; holding: int; pprice : float; };;
type account  = {name: string; max_ind_holding:float; pos:position list};;

let print_position pos = print_string "Holding: "; print_int pos.holding;
print_string ( " " ^ pos.symbol ^ "@" );
print_float pos.pprice;
print_newline(  );;


let print_account acct = print_string ( "Account_ID " ^ acct.name );
print_newline(  ); 
List.iter print_position acct.pos;;


(*MAIN PART OF CODE *)

let hashtbl_function db = 
    let hash_tbl_fold = Hashtbl.fold ( fun x y z -> ( ( y ) :: z ) ) db [] in
    ( fun x -> List.iter print_account x ) hash_tbl_fold (* THIS WORKS FINE *)
;;

Но, если я захочу изменить последний, как сделать итерацию «списка позиций» в этой функции (не в print_account), я получу ошибку:

let hashtbl_function db = 
    let hash_tbl_fold = Hashtbl.fold ( fun x y z -> ( ( y ) :: z ) ) db [] in
    ( fun x -> List.iter print_position x ) hash_tbl_fold.pos (* Why this doesn't work ???*)
;;

Ошибка: это выражение имеет тип 'список, но здесь используется с типом account

Но hash_tbl_fold.pos - это список позиций, это нетип аккаунта.Правильно?

В print_account - acct.pos (чтобы получить список) - это работа, но в hashtbl_function hash_tbl_fold.pos -> not.

Как это может быть, то же выражениеработает только в одной из функций?Как я могу перебрать 'список позиций' в hashtbl_function?

заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 19 мая 2011

Ну, я не уверен, что именно вы хотите сделать, но я могу сказать вам, почему это не работает.hashtbl_fold дает вам список учетных записей (введите account list), но затем вы делаете hashtbl_fold.pos;вы не можете получить pos поле списка, следовательно, ошибка.

В print_account, acct.pos работает, потому что acct является одной учетной записью;не список учетных записей.

Что вы хотите сделать?Распечатать все позиции всех счетов?Или только позиции одного (какого?) Счета?

0 голосов
/ 19 мая 2011

Ваш ответ (это не аккаунт, а тип списка аккаунтов) поможет мне разобраться. Теперь я могу использовать hash_tbl_fold.pos внутри моей hashtbl_function. Это работает для меня:

let hash_tbl_fold =  Hashtbl.fold ( fun x y z -> ( ( y ) :: z ) ) db [] in
List.iter ( fun x -> List.iter print_position x.pos ) hash_tbl_fold

Tnx!

...