gpt4 book ai didi

ocaml - (懒)Haskell 在 OCaml 中未定义/底部

转载 作者:行者123 更新时间:2023-12-03 02:35:04 27 4
gpt4 key购买 nike

Haskell 有一个非常膨胀的 undefined 值,它会惰性地引发异常(在求值时)。 Ocaml当然是严格的,所以as far as I can tell there is no equivalent of Haskell's undefined 。但这很不幸,因为这意味着值没有底部类型。假设我想要一个

val a : int

我当然可以

let a = failwith "undefined"
let () =
print_string "something unrelated\n"

这样就可以愉快地编译了。不幸的是,在运行它时我们得到了未定义的异常(这是预期的)。

我想要的是让 a 成为底部/未定义值而不更改其类型(因此像Lazy这样的东西将不起作用)。这可能吗?

额外详细信息:所以我的要求可能听起来相当愚蠢。为了减少对我为什么不应该这样做的任何评论,请允许我简要描述我的用例。我正在编写一个脚本,该脚本修改 mli 文件的 AST,以生成与其签名匹配的“空”ml 文件。对于一般情况,mli 中可能有 val a : int,因此我需要一种通用合成底部类型的方法。如果我所需要的只是编译成功,则 failwith "undefined" 可以工作。但不幸的是,我还需要将此 ml 文件链接到 OUnit 测试套件并运行它(显然该套件会失败,但目的是能够使用 -list- 运行它) test,以便我可以通过编程方式获取所有测试的列表)。

更多详细信息:我认识到解决这个问题的正确方法(可能)是编写一个可以为任何泛型类型生成底部类型的函数。对于内置原语(以及 listoption 等),这足够简单(只是冗长)。对于记录,这变得更加复杂(可能在 stdlib 中定义,但也可能在同一文件或不同的包中定义)。为了处理这个问题,我的 AST 转换器需要完全了解 OCaml 类型系统和包的文件导入策略,这比我想要/应该包含的逻辑要多得多。

最佳答案

OCaml 没有未定义。我认为这是幸运的,因为我在 Haskell 中唯一的麻烦就是懒惰。 :-P

我不惜一切代价避免使用Obj.magic。使用 Obj.magic 测试代码听起来不是正确的测试...

为了避免 int 的值立即失败,我会将类型更改为 unit -> intint option 以轻松实现默认值。

let a = fun () -> failwith "undefined"
let a = None

或者,也许,一般使用 [@@deriving xxx] 生成给定类型的默认值可能适合您的情况,因为您有 mli。但我担心它需要一个新的派生程序来进行 ppx_deriving 或使用 typerepppx_typerep_conv 进行编程。

关于ocaml - (懒)Haskell 在 OCaml 中未定义/底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48280201/

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