1

同じ型の引数fを取る関数があるとしますnf: '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_listn

4

1 に答える 1

4

Objできません (つまり、モジュールの闇の魔法に頼らなければ)。確かに、2 つの問題があります。まず、OCaml の型システムは、引数の長さに実際に依存する'a list -> ('a * 'a * ... * 'a)whereのようなものを表すことができません (たとえば、Coq でそのようなことを行うことができます)。...第二に、OCaml では、n-uple はペアの反復バージョンではありません。つまり、 type の値は typeの値でも'a * 'a * 'atype の値でもないため、リストの要素から段階的に nuple を構築することはできません。'a * ('a * 'a)('a * ('a * 'a))

# 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 に答える