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是调用函数所需的参数数量,因此它是常量.
编辑:这个也不起作用.
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的键入,而不必为之苦恼.我坚持对强类型的评论:一旦您习惯了强类型,就很难放弃这种优势,而回到很少(或根本没有)键入支持的语言.
标签:ocaml,python 来源: https://codeday.me/bug/20191118/2026262.html