如何根据 OCAML 中的上下文使参数采用伪 "null" 值

How to make a parameter take a pseudo "null" value depending on the context in OCAML

我想制作一个接受列表和运算符的函数,并对列表的所有元素执行该操作。

问题是,在制作辅助函数时,我不知道如何将附加参数初始化为函数将作为输入的数据类型的 "NULL"。

例如,如果我们正在处理整数,我希望我的参数取值 0、0。对于浮点数和字符串“”。

提前致谢!

let rec combine_all_aux (va:'a) (op:'a -> 'a -> 'a) (li:'a list) (ret:'a) = match li with
  | [] -> va
  | h :: t -> combine_all_aux va op t (op ret h)
;;

let combine_all va op li =
  combine_all_aux va op li (Something)
;;

我注意到的第一件事是您的代码,如给定的那样,总是 returns va。当它到达列表末尾时,它会忽略累加值 ret.

因此,很难准确理解该函数的作用。我们应该考虑 va 在列表的末尾还是开头?您实施的是右折还是左折?

假设您正在实施左折叠,并且 va 应该位于列表的末尾。然后调用:

combine_all va op [e1; e2; e3]

相当于这个表达式(用+表示op参数):

(((e1 + e2) + e3) + va)

如果这是您的目标,我想到的一种解决方案是考虑列表 li @ [va]。该列表在构造上是非空的。因此,您始终可以提取列表的头部并将其用作您的初始累加值(您称之为 ret)。然后将递归函数应用于 li @ [va].

的尾部

如果 va 应该被认为是在列表的开头,事情就更容易了。您已经有了非空操作数列表的头部和尾部:va 是头部,li 是尾部。

感谢@Jeffrey,我使用 head 作为累加器编写了函数,这样就不需要额外的参数了。

let rec combine_all_aux (va:'a) (op:'a -> 'a -> 'a) (li:'a list) = match li with
  | [] -> va
  | h :: t -> op h (combine_all_aux va op t)
;;