Python 在OCaml中将列表用作函数的参数
我目前正在努力学习OCaml。我正在搜索与此python代码等效的代码: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);; 下面是我收到的错误消息:
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
。。。;这会解决我的问题。