有一块正常工作的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 ???*)
;;
错误:此表达式的类型为“列表,但此处与类型帐户一起使用
但是hash_tbl_fold.pos是位置列表,这不是帐户类型。正确?
在print_account中 - acct.pos(获取'列表)是可行的,但是在hashtbl_function中,hash_tbl_fold.pos - >不
怎么可能,同一个表达式只适用于其中一个函数? 我如何在hashtbl_function中迭代'position list'?
提前感谢!
答案 0 :(得分:3)
好吧,我不确定你到底想做什么,但我可以告诉你它为什么不起作用。
hashtbl_fold
为您提供了一个帐户列表(类型account list
),但您正在执行hashtbl_fold.pos
;你不能得到列表的pos
字段,因此错误。
在print_account
,acct.pos
有效,因为acct
是一个帐户;不是帐户清单。
你想做什么?打印所有帐户的所有头寸?或者只是一个(哪个?)帐户的位置?
答案 1 :(得分:0)
您的回答(这不是帐户,但是帐户列表类型)可以帮助我解决问题。 现在,我可以在hashtbl_function中使用hash_tbl_fold.pos。 这对我有用:
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!