如何从列表中提供函数参数?

时间:2013-09-20 07:51:08

标签: ocaml

假设我有一个函数f,它接受​​相同类型的n个参数f: 'a * 'a * ... * 'a -> 'b

假设我有l n个元素的列表'a

仿函数call_function_with_list是否存在?这意味着: call_function_with_list f l = f l[0] l[1] ... l[n-1]

请注意,我不想为固定数字call_function_with_list指定特定的n(这可以非常简单地完成)但我感兴趣的是有一个通用的call_function_with_list适用于所有n

1 个答案:

答案 0 :(得分:4)

你不能(不使用Obj模块的黑暗魔法)。实际上,有两个问题。第一个OCaml的类型系统不能代表像'a list -> ('a * 'a * ... * 'a)这样的东西,其中...实际上取决于参数的长度(你可以在Coq中做类似的事情)。其次,在OCaml中,n-uple不是对的迭代版本,即类型'a * 'a * 'a的值既不是类型'a * ('a * 'a)也不是类型('a * ('a * 'a))的值,所以你无法从列表元素中逐步构建您的nuple。

# let x = (1,2,3);;
val x : int * int * int = (1, 2, 3)
# let y = (1,(2,3));;
val y : int * (int * int) = (1, (2, 3))
# let z = (1,2),3;;
val z : (int * int) * int = ((1, 2), 3)
# x = y;;
Error: This expression has type int * (int * int)
       but an expression was expected of type int * int * int
# x = z;;
Error: This expression has type (int * int) * int
       but an expression was expected of type int * int * int