1

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

假设我有一个元素列表ln '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

4

1 回答 1

4

你不能(Obj也就是说,不求助于模块的黑魔法)。确实,有两个问题。第一个 OCaml 的类型系统不能表示类似于'a list -> ('a * 'a * ... * 'a)where...实际上取决于参数长度的东西(例如,您可以在 Coq 中做类似的事情)。其次,在 OCaml 中,n-uple 不是 pair 的迭代版本,即 type'a * 'a * 'a的值既不是 type 的值'a * ('a * 'a)也不是 type的值('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
于 2013-09-20T08:16:42.703 回答