编程语言
首页 > 编程语言> > 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);;

这是我收到的错误消息:

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