ocaml此表达式具有类型'列表,但此处与类型X(帐户)一起使用

时间:2011-05-18 11:09:45

标签: functional-programming types function iterator ocaml

有一块正常工作的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'?

提前感谢!

2 个答案:

答案 0 :(得分:3)

好吧,我不确定你到底想做什么,但我可以告诉你它为什么不起作用。 hashtbl_fold为您提供了一个帐户列表(类型account list),但您正在执行hashtbl_fold.pos;你不能得到列表的pos字段,因此错误。

print_accountacct.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!