假设我有一个函数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
答案 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