我目前正在尝试学习OCaml。我正在寻找相当于这个python代码:
f(*l[:n])
我以为我会尝试编写一个模拟此行为的函数,但它不起作用。这是代码:
let rec arg_supply f xs n =
if n = 0 then
f
else
match xs with
| x :: remainder -> arg_supply (f x) remainder (n - 1);;
以下是我收到的错误消息:
Error: This expression has type 'a but an expression was expected of type
'b -> 'a
The type variable 'a occurs inside 'b -> 'a
感谢任何帮助,无论是使我的函数工作的方式,还是以列表的前n个元素作为参数提供列表的前n个元素。
编辑:n
是调用函数所需的参数数量,并且因此而保持不变。
编辑:这个也不起作用。
type ('a, 'r) as_value = ASFunction of ('a -> ('a, 'r) as_value) | ASReturnValue of 'r;;
let rec _arg_supply f_or_rval xs n =
if n = 0 then
f_or_rval
else
match f_or_rval with
| ASFunction func -> (
match xs with
| x :: r -> _arg_supply (func x) r (n - 1)
| _ -> failwith "too few arguments for f"
)
| ASReturnValue out -> out;;
答案 0 :(得分:3)
您的Python函数f
正在传递不同数量的参数,具体取决于n
的值。这不能用OCaml表示。函数采用静态固定数量的参数(即,您可以通过阅读源代码来判断参数的数量)。
将不同数量的参数传递给OCaml函数的方法是传递一个列表,对应于Python代码f(l[:n])
。
(更准确地说,OCaml函数需要一个参数,但这是另一个时间的讨论。)
<强>更新强>
如果n
实际上是一个常数,请说出它的3.然后你可以执行以下操作:
match l with
| a :: b :: c :: _ -> f a b c
| _ -> failwith "too few arguments for f"
更新2
这是了解你想做什么的另一种方式。你想写一个函数,让它调用它apply
,就像这样:
let apply f xs =
. . .
我们的想法是apply
调用函数f
,从列表xs
中为其提供参数。
OCaml是一种强类型语言,因此我们应该能够为f
和xs
提供类型。 f
的类型是什么?您希望它是n
参数的函数,其中n
是xs
的长度。即,n
不是常数!但OCaml中没有这种类型。任何函数类型都有固定的静态参数。由于f
没有OCaml类型,因此您无法编写函数apply
。您可以编写一系列函数apply1
,apply2
等。请注意,每个功能都有不同的类型。如果你不介意为每个不同的函数f
调用正确的函数,那就可以了。