Python 在OCaml中将列表用作函数的参数

Python 在OCaml中将列表用作函数的参数,python,ocaml,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);; 下面是我收到的错误消息:

我目前正在努力学习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个元素作为参数提供给函数的方式

Edit:
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;;

根据
n
的值,将向Python函数
f
传递不同数量的参数。这不能用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
,那就行了


很可能您可以重新构造问题,以使用OCaml的键入,而不是与之斗争。我坚持我对强类型的看法:一旦你习惯了强类型,你就很难放弃它的优点,回到几乎没有(或根本没有)类型支持的语言上去。

你不能这样做。
arg\u供应的类型必须取决于
n
的运行时值。这是一个典型的问题。你能解释一下你真正想做什么吗?这不能解释你为什么想要这个。用例是什么?特别是,它没有解释为什么直接传递列表不能解决您的问题。@coredump否。我正在构建一个基于节点的动画软件,其中值也可以是函数。我创建了一些函数,形式为
let circle\u color\u at radius fill stroke\u width inputs=let x=List.nth inputs 0和y=List.nth inputs 1…
,我调用节点的run函数中没有x和y的函数:
let circle\u run inputs=FunctionValue(circle\u color\u at(List.nth inputs 0)(List.nth inputs 1)(List.nth inputs 2)(List.nth inputs 3))
对不起,我没有在我的问题中澄清它。n是f和常量所需的参数量。这就是
[:n]
事情的原因。我倾向于怀疑
n
实际上是一个常量。否则你会编写类似于f(*l[:3])。但是为任何给定的
n
值编写代码并不难。请参阅上面的更新。这意味着我应该创建arg\u supply\u 1,arg\u supply\u 2,…这不是我真正想要的。如果我不需要对其中的每一个值都编写代码就可以了。嗯,你说
n
是一个常量,所以应该只有一个函数。:-,如果可能的话,您应该向函数传递一个列表。强大的打字功能会有一些折衷,但当你习惯了它之后,很难回头。您不想使用具有松散类型系统(如果有的话)的语言的模式。我的意思是,
n
对于每个调用都是常量。因此,如果有可能创建一个“模板”来创建所有这些函数,
arg_supply_1
arg_supply_2
。。。;这会解决我的问题。