f# - 有没有更好的方法在 F#/OCaml 中编写交换函数?

标签 f# ocaml commutativity

是否有更优雅或更好的方法在 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/

相关文章:

f# - F#的通用类型定义语法

performance - 快速获得 Eratosthenes 的功能筛

comments - 如何检查 OCaml 顶层 (*) 的类型?

ruby - 为什么乘法在 Ruby 中并不总是可交换的?

f# - 为什么 F# 会出现模块名称部分重叠的问题?

f# - 无阻塞地从可观察到可枚举/值

html - 使用 OCaml 解析 HTML

error-handling - 使用 int_of_float 从浮点转换时如何处理 OCaml 中的整数溢出?

c++ - C++中的浮点加法是否可交换?

c++ - boost 是否提供 make_zip_range?