gpt4 book ai didi

ocaml - 实现和代表多元操作

转载 作者:行者123 更新时间:2023-12-04 21:25:15 26 4
gpt4 key购买 nike

我不确定我什至知道如何问这个问题。在实现编译器时,我希望允许客户端指定,比如说,在元组上折叠。我提供了一种对函数进行 curry 和 uncurry 的方法,但这仅仅是因为我在 Ocaml 中编写了一个二元运算符并将其折叠在术语和类型表示上。用户无法编写此函数。

在宏处理器中,用户可以编写此函数,因为元组是列表。

对于 curried 函数,用户可以轻松编写转换器,因为术语在目标语言和术语的 Ocaml 表示和类型中都是二进制的。

但是他们不能对元组这样做。这是另一个例子:用户很容易定义串行功能组合运算符。但用户无法定义并行组合:二进制版本:

 f1: D1 -> C1, f2: D2-> C2 --> f1 * f2: D1 * D2 -> C1 * C2

很容易写,但不能扩展到 3 项:这里折叠将计算
 f1 * (f2 * f3)

代替
f1 * f2 * f3

[同构但不相等]

这个问题的概括是“我如何实现一种多面体编程语言”,在这里问的有点太多了。我试图做的是提供一个内置的变压器:

curry :T1 * T2 * T3 ... --> T1 -> T2 -> ...
uncurry: T1 -> T2 -> .. T1 * T2 * T3

因此,用户可以使用二元运算符进行折叠:
uncurry (fold user_op (uncurry term))

但这既不够通用,也不够好.. :)

我猜 Haskell 的一个等效问题是:由于 Haskell 没有 n 元乘积,因此 n 元组构造函数在库中用 n 个函数模拟,每个函数都必须手动写出。这显然很糟糕。这将如何解决?

[我的意思是,编写一个 Python 脚本来生成这些 n 个函数到某个限制 n 是微不足道的,那么为什么在语言中以一种良好类型的方式做到这一点如此困难?]

最佳答案

有两个组件相互协作导致此问题:

  • 元组不是自动展平的——类型表达式中的括号不仅仅是分组,它们创建了由进一步的元组连接的不同类型。这导致您观察到 a * (b * c)是同构的,但不等于 a * b * c .
  • 类型系统不提供在元组类型上表达代数的方法。我的意思是类型系统没有 cons 运算符或元组的任何等价物。无法表示一种类型比另一种类型具有更多或更少的元组元素。

  • 结果是无法表达对任意长度的元组进行操作的函数的类型。

    所以,简短的总结是 OCaml 类型系统缺乏机制来表达你试图编写的函数的类型,因此你不能编写函数(用 Obj 撇开讨厌的游戏;你可以编写函数,但是您无法表达它的类型以以类型安全的方式使用它)。

    关于ocaml - 实现和代表多元操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4599587/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com