gpt4 book ai didi

ocaml - 基本类型驱动的 ppx 重写

转载 作者:行者123 更新时间:2023-12-01 09:54:06 25 4
gpt4 key购买 nike

我正在编写我的第一个 ppx 扩展。这个想法是支持多态 print功能,类似于show在 Haskell 中。

(我知道还有其他更强大的解决方案,但我希望了解更多有关其工作原理的信息。)

我采用的方法与描述的方法非常相似 here : 我有一个寻找 %[print <expr>] 的映射器标签,然后将它们替换为 <expr> 的字符串表示形式.例如,

[%print 1] ==> string_of_int 1
[%print "aksljd"] ==> "aksljd"

这适用于常量表达式,但我想支持任意表达式来代替 <expr> .它应该只是用最终类型的打印机包装它们。

我目前的做法是使用 Typecore.type_expressionParsetree.expression进入 Typedtree.expression , 然后匹配exp_type Typedtree.expression 的领域并确定用什么替换整个表达式。例如,对于类型 type test = A of int | B of string , 我会替换 [%print A 1]show_test (A 1)那里(show_test 必须按照约定出现)。

这不起作用,因为 Typecore.type_expression将类型环境作为参数,在重写时我无法获得“当前类型环境”,因为那时甚至还没有执行类型检查... [%print 1 + 1]Typecore.type_expression Env.empty原因Unbound value + ,这是应该的。

有人有办法解决这个问题吗?如果我完全朝着错误的方向前进,请随时指出这一点。 :p

最佳答案

评论中的讨论摘要:show 在 Haskell 中不是这样工作的(也不能)。 Show a => 在 Haskell 中将被转换为 OCaml 中的显式模块参数。该模块将有一个带有签名的值,如 print : a -> string。 Haskell 通过为您(或库)声明的 a 找到 Show 的实例来推断此模块参数,但在 OCaml 中,您必须手动传递该模块。在 Haskell 中声明 Show 实例类似于在 OCaml 中实例化仿函数。

在 Haskell 和 OCaml 中,问题中的预处理表达式在以下情况下具有可疑的含义:

let f x = [%print x]

如果 f : 'a -> string(即没有可用的 Haskell 类型类实例,也没有传递 OCaml 模块)。

为了使其更加完整,许多其他分析类型的 ppx 重写器从类型定义或声明而不是表达式生成代码。

关于ocaml - 基本类型驱动的 ppx 重写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32173627/

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