是否有更优雅或更好的方法在 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
但是如果我采用这种方法,我就不能在函数中拥有与所有内容匹配的默认情况,除非我添加另一个参数,其值指示是否是第二次调用该函数并返回默认值而不是调用该函数如果是这种情况,请使用交换的参数。
还有其他想法吗? 该语言是否提供了一种结构来表达我定义的函数是可交换的这一事实?
最佳答案
(我只回答 OCaml,因为我的 F# 非常生锈。)
OCaml 中没有关于定义交换函数的特殊帮助。
如果您的参数类型具有合理的排序关系,您可以在必要时交换它们以使 x 更大(例如)。几乎所有类型都可以在 OCaml 中进行比较,因此这应该非常普遍。 (无法比较的东西:函数类型、循环值。)
我不确定这是否有帮助,但它可能会减少您需要写出的案例数量:
let commutative x y =
match (max x y, min x y) with
| A, _ -> value
. . .
关于f# - 有没有更好的方法在 F#/OCaml 中编写交换函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59472260/