2

有没有更优雅或更好的方法来在 F#/OCaml 中编写交换函数,而不是列出所有可能的情况?

let commutative x y = 
    match x,y with
        a, _ -> val1
       |_, a -> val1
       |b, _ -> val2
       |_, b -> val2
       ...
       |_,z -> |valN

当我写这个问题时,我认为如果没有找到匹配项,可以使函数递归并交换参数。

let rec commutative x y = 
    match x,y with
     a,_ -> val1
    |b,_ -> val2
     ...
    |nox,noy -> commutative noy nox

但是,如果我采用这种方法,除非我添加另一个参数,其值指示它是否是第二次调用该函数并返回默认值而不是调用带有交换的函数args 如果是这样的话。

还有其他想法吗?该语言是否提供了一种结构来表达我定义的函数是可交换的这一事实?

4

1 回答 1

4

(我只回答 OCaml,因为我的 F# 非常生锈。)

OCaml 中对于定义交换函数没有特别的帮助。

如果您的参数类型具有合理的排序关系,您可以在必要时交换它们以使 x 更大(例如)。几乎所有类型都可以在 OCaml 中进行比较,因此这应该非常普遍。(不能比较的东西:函数类型、循环值。)

我不确定这会有所帮助,但它可能会减少您需要写出的案例数量:

let commutative x y =
    match (max x y, min x y) with
    | A, _ -> value
    . . .
于 2019-12-24T18:54:06.850 回答