- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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
,以便我可以通过编程方式获取所有测试的列表)。
更多详细信息:我认识到解决这个问题的正确方法(可能)是编写一个可以为任何泛型类型生成底部类型的函数。对于内置原语(以及 list
、option
等),这足够简单(只是冗长)。对于记录,这变得更加复杂(可能在 stdlib 中定义,但也可能在同一文件或不同的包中定义)。为了处理这个问题,我的 AST 转换器需要完全了解 OCaml 类型系统和包的文件导入策略,这比我想要/应该包含的逻辑要多得多。
最佳答案
OCaml 没有未定义
。我认为这是幸运的,因为我在 Haskell 中唯一的麻烦就是懒惰。 :-P
我不惜一切代价避免使用Obj.magic
。使用 Obj.magic
测试代码听起来不是正确的测试...
为了避免 int
的值立即失败,我会将类型更改为 unit -> int
或 int option
以轻松实现默认值。
let a = fun () -> failwith "undefined"
let a = None
或者,也许,一般使用 [@@deriving xxx]
生成给定类型的默认值可能适合您的情况,因为您有 mli。但我担心它需要一个新的派生程序来进行 ppx_deriving
或使用 typerep
和 ppx_typerep_conv
进行编程。
关于ocaml - (懒)Haskell 在 OCaml 中未定义/底部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48280201/
我正在尝试以更命令的方式表达一组链式调用。例如,图像我们有一个函数,它接受一个列表和一个元素,并将该元素附加到列表的末尾: let insert l e = l @ [e] 我想一次插入几个元素。
是否有一个完整的列表(或详尽的规则)可以给 OCaml 中的自定义中缀运算符提供可能的名称? 最佳答案 如 OCaml manual 中所述, 中缀运算符必须匹配正则表达式 [-=<>@^|&+*/$
我想开始使用 OCaml 编程。由于我是 Windows 用户,我知道最好使用 Netbeans 的 OCaml 插件。 我已经从以下链接下载了上述插件:http://ocamlplugin.loki
能够做到这一点以获得最大速度不是很重要吗? 编辑: 例如,Clojure 有 map ,它使用多个核心。 Harrop 博士写道(2011 年 1 月 9 日): 语言中添加的新功能,例如一流 OCa
我在 x86 机器上用字节码编译 OCaml 程序,然后将字节码传输到 ppc64 机器。假设 ppc64 机器有 ocamlrun(为 ppc64 编译),我能在 ppc64 架构上执行我的程序吗?
我创建了一个新模块,它只是名称很长的模块的较短别名: module M = ModuleWithLongName 我处于最终可执行文件的大小很重要的情况。上面的构造是由编译器合理处理的吗(即 M 实际
我在使用 ocaml 时遇到了麻烦。 我想创建一个函数,每次调用它时都会增加我的计数器,并将我的 vargen 字符串与计数器编号连接起来,然后返回这个新字符串。 我没有成功的做法是: let (co
我正在学习 OCaml,我对变量的不变性有点困惑。根据我正在阅读的书,变量是不可变的。到目前为止一切顺利,但为什么我可以这样做: let foo = 42 let foo = 4242 我错过了什么?
非尾递归组合函数可以这样写: let rec combinations l k = if k List.length l then [] else if k = 1 then List.ma
我有一段包含camlp4引用的代码。 let f_name = "my_func" > 运行此程序后 camlp4of ,它产生这个: Ast.StExp (_loc, (Ast.ExAp
如何在 OCaml 中模拟这个 Python 习语? if __name__=="__main__": main() 见 RosettaCode其他编程语言中的示例。 最佳答案 Ocaml 中没
我开始学习 Ocaml,使用 hickey book ,我被困在练习 3.4,第 9 部分 让 x x = x + 1 在 x 2 运算结果为3 ,但我不明白为什么? 最佳答案 当你写 let x x
Rust具有线性系统。有什么(好的)方法可以在 OCaml 中模拟这个吗?例如,当使用 ocaml-lua 时,我想确保仅当 Lua 处于特定状态(堆栈顶部的表等)时才调用某些函数。 编辑 :这是最近
在 OCaml?我知道非常酷的Bitstring图书馆,但是 虽然这将是在某些协议(protocol)中解析二进制数据的好方法, 它不支持异或或移位等按位运算。 我相信该库使用的底层数据结构是 只是
我们可以像这样构造一个无限列表: let rec endless = 1::endless 我认为它会吃掉所有的内存,但是当我在 utop 中尝试时,好像不是这样。 utop显示列表已构建: val
是否可以通过合并列表的元素而不是创建列表的列表来创建列表? 例子: List.combine ["A";"B"] ["C";"D"];; 我得到: [("A", "C"); ("B", "D")] 有
我想在 OCaml 中创建一个查找表。该表将有 7000 多个条目,在查找时(通过 int)返回一个字符串。用于此任务的适当数据结构是什么?表是否应该从基本代码中外部化,如果是这样,如何“包括”查找表
我正在评估 Ocaml 顶层中的一段非常简单的代码: let p5 () = print_int 5;; p5 ();; print_string "*************************
记录和元组之间是否有任何区别而不仅仅是句法差异? 有性能差异吗? 元组和记录的实现是否相同? 您是否有可以使用元组完成但不能使用记录完成的事情的示例(和 反之)? 最佳答案 模数语法它们几乎相同。主要
OCaml 中的 ` 运算符有什么作用? let int_of_meth = function | `GET -> 0 | `POST -> 1 | `PUT ->
我是一名优秀的程序员,十分优秀!