我正在自学OCaml,我有时需要创建一个功能,我不确定应该是什么样的正确解决方案。这是我有点困惑的一个。
我需要一个函数来提示用户输入单个浮点值并返回浮点列表中输入的所有内容。我可以创建这个函数,但我不确定它是否是在Ocaml中执行此操作的正确/最佳方式。
这是我的尝试。
let rec get_floats() =
match
(
try Some(read_float())
with
| float_of_string -> None
)
with
| None -> []
| Some s -> s :: get_floats();;
这段代码有效但是我很难决定它是否是一个“正确的OCaml”解决方案。注意,要退出函数并返回浮点列表,只需输入一个非整数值。
答案 0 :(得分:4)
(我希望如此)这是一个简单的窥视孔重写,无需考虑你问题中的任何功能:
let rec get_floats() =
try
let f = read_float() in (* as suggested by Martin Jambon *)
f :: (get_floats())
with
| float_of_string -> []
我试图在这里应用的想法是,您不需要将read_float
的成功/失败转换为您立即匹配的选项:只需执行您要对读取的值执行的操作,然后让with
处理失败案例。
现在我想到了,我应该指出,在你的问题和我的重写中,float_of_string
是一个新的变量。如果您打算匹配特定的异常,那么您就失败了:所有异常构造函数(如数据类型构造函数)都是大写的。您也可以编写with _ ->
而不是with float_of_string ->
,并且所有警告处于活动状态的OCaml的最新版本应该告诉您,您的函数(或我的)绑定变量float_of_string
而不使用它
答案 1 :(得分:0)
感谢大家的帮助。这很有效。
let rec get_floats() =
try
let x = read_float() in
x :: get_floats()
with
| _ -> [];;
List.iter(fun x - > print_endline(string_of_float x))(get_floats());;