OCaml-创建一个函数,该函数提示输入浮点值并返回浮点值列表

OCaml-创建一个函数,该函数提示输入浮点值并返回浮点值列表,ocaml,Ocaml,我在自学OCaml,有时我需要创建一个函数,在这个函数中,我不确定正确的解决方案应该是什么。这是一个我有点困惑的问题 我需要一个函数,它将提示用户输入单个浮点值,并返回浮点列表中输入的所有内容。我可以创建这个函数,但我不确定这是否是在Ocaml中实现它的正确/最佳方法 这是我的尝试 let rec get_floats() = match ( try Some(read_float()) with | float_of_string -> None ) with |

我在自学OCaml,有时我需要创建一个函数,在这个函数中,我不确定正确的解决方案应该是什么。这是一个我有点困惑的问题

我需要一个函数,它将提示用户输入单个浮点值,并返回浮点列表中输入的所有内容。我可以创建这个函数,但我不确定这是否是在Ocaml中实现它的正确/最佳方法

这是我的尝试

let rec get_floats() =
match
(
    try Some(read_float())
    with
    | float_of_string -> None
)
with
| None -> []
| Some s -> s :: get_floats();;
这段代码可以工作,但我不知道这是否是一个“合适的OCaml”解决方案。请注意,要退出函数并返回浮点列表,只需输入一个非整数值。

(我希望)这是一个简单的窥视孔重写,不需要考虑问题中的函数:

let rec get_floats() =
  try 
    let f = read_float() in (* as suggested by Martin Jambon *)
    f :: (get_floats())
  with
    | float_of_string -> []
我尝试在这里应用的想法是,您不需要将
read\u float
的成功/失败转换为您立即匹配的选项:只需对读取的值执行您必须执行的操作,并让
处理失败情况



现在我想起来了,我应该指出,在你的问题和我的重写中,
float\u of_string
是一个新的变量。如果您想匹配一个特定的异常,那么就失败了:所有异常构造函数,比如数据类型构造函数,都是大写的。您可能已经用
编写了
,而不是用float\u of \u string->
编写了
,而最新版本的OCaml(所有警告都处于活动状态)应该告诉您,您的函数(或我的函数)绑定了一个变量
float\u of \u string
,但从未使用过它。

谢谢大家的帮助。这很有效

let rec get_floats() =
try
    let x = read_float() in
    x :: get_floats()
with
| _ -> [];;

iter(funx->print_endline(string_of_float x))(get_floats())

这就是为什么我贴出这个问题。谢谢你简化了我要做的事情。我不知道为什么用OCaml的方式思考对我来说如此困难。我只是尝试了你的解决方案,发现它不起作用。当用户输入非浮点值时,函数get_floats()将不会返回。未指定计算顺序。试试看:让x=read\u float()在x::get\u floats()中。谢谢,更新后的版本可以工作,但我真的很难理解您是如何做到这一点的。您是否声称::运算符没有指定求值顺序?@user3158810正是这样。一般来说,OCaml中几个参数的(curried)函数按未指定的顺序计算它们的参数。也就是说,如果您有
e1 e2 e3
,其中
e1
e2
e3
中的每一个都是一个表达式,则在应用程序发生之前,它们可以按任意顺序缩减为值v1、v2和v3(如果程序类型正确,v1将缩减为函数或永不终止)。这种差异仅在
e1
e2
e3
中的一种副作用中可见(例外情况是副作用)