Ocaml 打印例外列表

Ocaml 打印例外列表,ocaml,Ocaml,我是OCaml新手,正在用OCaml编写一个递归程序,返回列表的第n个元素。但是,当列表太短时,我需要显示一条信息性错误消息,显示一个列表,比如“(abc)没有5个元素”。 这是我的密码 let rec nth_element n list = match list with | [] -> raise(Failure "") | a :: l -> match n with 0 -&g

我是OCaml新手,正在用OCaml编写一个递归程序,返回列表的第n个元素。但是,当列表太短时,我需要显示一条信息性错误消息,显示一个列表,比如“(abc)没有5个元素”。 这是我的密码

    let rec nth_element n list =
       match list with
       | [] -> raise(Failure "")
       | a :: l -> match n with
              0 -> a
              n -> nth_element (n-1) l

我想用所需的错误消息替换“raise(Failure)”部分。为同一个函数编写函数没有帮助,因为它返回的是单位类型,而int类型是必需的。

在OCaml中有表达式
e
的任何地方,也可以有表达式
s;e
其中
s
单元类型的表达式。下面是一个只会引发异常的函数:

let f () = raise (Failure "")
下面是一个函数,它执行相同的操作,但先写出一条消息:

let f () = Printf.printf "helpful message"; raise (Failure "")
作为旁白,这不是特别惯用的OCaml。为什么不把有用的消息放在异常中呢?像这样:

let f () = raise (Failure "helpful message")

在OCaml中有表达式
e
的任何地方,都可以有表达式
s;e
其中
s
单元类型的表达式。下面是一个只会引发异常的函数:

let f () = raise (Failure "")
下面是一个函数,它执行相同的操作,但先写出一条消息:

let f () = Printf.printf "helpful message"; raise (Failure "")
作为旁白,这不是特别惯用的OCaml。为什么不把有用的消息放在异常中呢?像这样:

let f () = raise (Failure "helpful message")

是否需要在错误消息中打印整个列表? 如果您只需要打印缺少的项目计数,您可以这样做:

failwith (Printf.sprintf "The list is %d elements too short" n)

是否需要在错误消息中打印整个列表? 如果您只需要打印缺少的项目计数,您可以这样做:

failwith (Printf.sprintf "The list is %d elements too short" n)

我可以在提升括号内打印“列表”的内容吗?这就是我打算做的!通常不会,因为必须指定列表中元素的类型,所以您将失去多态性。另请注意,
failwith x
是提升(Failure x)
的捷径,rgrinberg的意思是,如果您打印列表中的项目,您必须选择一种类型进行打印。因此,该函数只适用于这一类型的项。一般来说,你希望避免这种情况;OCaml非常棒,部分原因是您可以轻松编写适用于任何类型的函数(多态函数)。如果您真的想打印错误消息中的列表,并希望保持函数的多态性,这是可能的,但您需要添加另一个参数:一个将列表元素转换为字符串的函数。我可以在提升括号内打印“list”的内容吗?这就是我打算做的!通常不会,因为必须指定列表中元素的类型,所以您将失去多态性。另请注意,
failwith x
是提升(Failure x)
的捷径,rgrinberg的意思是,如果您打印列表中的项目,您必须选择一种类型进行打印。因此,该函数只适用于这一类型的项。一般来说,你希望避免这种情况;OCaml非常棒,部分原因是您可以轻松编写适用于任何类型的函数(多态函数)。如果您真的想打印错误消息中的列表,并希望保持函数的多态性,这是可能的,但您需要添加另一个参数:一个将列表元素转换为字符串的函数。我无法编辑,系统告诉我编辑必须至少更改六个字符…应为
Printf.sprintf
。我无法编辑,系统告诉我编辑必须至少更改六个字符。。。