使用列表作为OCaml中函数的参数

时间:2016-09-10 16:20:41

标签: python ocaml

我目前正在尝试学习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;;

1 个答案:

答案 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是一种强类型语言,因此我们应该能够为fxs提供类型。 f的类型是什么?您希望它是n参数的函数,其中nxs的长度。即,n不是常数!但OCaml中没有这种类型。任何函数类型都有固定的静态参数。由于f没有OCaml类型,因此您无法编写函数apply。您可以编写一系列函数apply1apply2等。请注意,每个功能都有不同的类型。如果你不介意为每个不同的函数f调用正确的函数,那就可以了。

很可能你可以重构你的问题以使用OCaml的打字而不是挣扎。我坚持自己对强打字的评论:一旦你习惯了强力打字,就很难放弃这些好处,回到很少(或没有)打字支持的语言。