let x = 2;;
let x = 3
in let y = x +1
in x + 1;;
let x = 3 and y = x + 1
in x + y;;
结果按每个表达式分别排序:
val x : int = 2
- : int = 7
- : int = 6
你能帮我理解为什么最后一个表达式等于 6 吗?我很难理解。
我在tryOCamlpro中运行此代码。
let x = 2;;
let x = 3
in let y = x +1
in x + 1;;
let x = 3 and y = x + 1
in x + y;;
结果按每个表达式分别排序:
val x : int = 2
- : int = 7
- : int = 6
你能帮我理解为什么最后一个表达式等于 6 吗?我很难理解。
我在tryOCamlpro中运行此代码。
在我使用 OCaml 进行编程的实践中,我最近发现以下管道运算符对于创建函数非常有用。
let (>|) f g x = g (f x)
val ( >| ) : ('a -> 'b) -> ('b -> 'c) -> 'a -> 'c = <fun>
我用它来替换如下代码:
fun s -> int_of_string s |> Int.hash
- : string -> int = <fun>
更简单的是:
int_of_string >| Int.hash
- : string -> int = <fun>
关联性很好:
int_of_string >| float_of_int >| string_of_float
- : string -> string = <fun>
这是否会对核心语言产生有价值的改进?如果是,如何提交这一贡献?
我需要一些帮助来理解类型推断如何影响以下代码,该代码来自上一个问题(经过一番思考后,我将其简化为以下代码):
type 'a result =
| Succ of 'a
| Fail
let first f = function
| Succ c -> let res = f c in Succ res
| fail -> fail
let second f = function
| Succ c -> let res = f c in Succ res
| Fail -> Fail
我的问题是:为什么f
in first
has type('a -> 'a)
而f
in second
has type ('a -> 'b)
?
你可以在这里看到它。
我试图在函数内部创建一个本地求和类型,然后返回所述求和类型,而无需在 main 中声明它。这可能吗?我不相信它是直接的,但我一直在尝试使用 GADT 和多态变体来尝试找到解决方法,但我对 OCaml 仍然相当陌生,并没有完全理解它们。
我想要该函数执行以下操作。给定一个类型为 的元组,返回第一个元素,但其类型为和('a, 'b)
之间的总和。'a
'b
从加莱的回答来看,我尝试与 合作type ('a, 'b) either = | Left of 'a | Right of 'b
,但未能使其发挥作用。
编辑:为了回应 glennsl 的评论,我试图解决的问题是针对我的课程项目的。我正在尝试实现构造逻辑和程序之间的柯里-霍华德同构。我目前已经使定理证明器和程序提取正常工作,但在处理析取规则时,我正在努力将程序的抽象形式转换为 OCaml 代码。我使用的规则集来自本文档的第 34 页。我已经添加了析取规则的图片。
我问的例子是定理 (anb) -> (avb)。有两个有意义的证明,我选择了使用 vIL 规则的一个,它对应于将 A 类型的变量左和注入到具有两个组件 A 和 B 的 sum 类型中。定理(使用此规则)是一个函数,它接受一个元组并返回第一个元素,但总和类型为 A + B。我希望获得此示例函数的 OCaml 代码的帮助。一旦我理解了这一点,希望我能够概括它。
如果我们查看 OCamlList
模块的源代码,of_seq
定义为:
let[@tail_mod_cons] rec of_seq seq = match seq () with | Seq.Nil -> [] | Seq.Cons (x1, seq) -> begin match seq () with | Seq.Nil -> [x1] | Seq.Cons (x2, seq) -> x1 :: x2 :: of_seq seq end
这是完全有道理的,除了为什么在函数内执行额外的工作而不是编写看似更简单的以下函数?
let[@tail_mod_cons] rec of_seq seq =
match seq () with
| Seq.Nil -> []
| Seq.Cons (x1, seq) -> x1 :: of_seq seq
我缺少什么洞察力才能使这有意义?
我有这个 sql 查询来在 Sqlite3 中构建一个表,我使用的是工作正常的多行字符串。
let create_blog_table db =
let sql =
"
CREATE TABLE IF NOT EXISTS blog(
id INTEGER PRIMARY KEY AUTOINCREMENT,
author TEXT NOT NULL,
content TEXT NOT NULL);
"
in
match exec db sql with Rc.OK -> () | _ -> failwith "Error creating table"
但是当我运行dune fmt
(安装了 ocamlformat)时,结果如下:
let create_blog_table db =
let sql =
"\n\
\ CREATE TABLE IF NOT EXISTS blog(\n\
\ id INTEGER PRIMARY KEY AUTOINCREMENT,\n\
\ author TEXT NOT NULL,\n\
\ content TEXT NOT NULL);\n\
\ "
in
match exec db sql with Rc.OK -> () | _ -> failwith "Error creating table"
由于某种原因,这种格式是必要的还是可取的?
如果不是,我可以告诉它不要这样做吗?
我找到了规则break-string-literals
,但只允许auto
或never
.ocaml格式
profile = default
version = 0.26.0
break-string-literals=auto
我在使用CS3110 教科书的 Promises 部分中描述的语法lwt_ppx
时遇到问题( https://cs3110.github.io/textbook/chapters/ds/promises.html)。let%lwt
在提供的代码片段中:
open Lwt_io
let p =
let%lwt s1 = read_line stdin in
let%lwt s2 = read_line stdin in
Lwt_io.printf "%s\n" (s1^s2)
let _ = Lwt_main.run p
我正在尝试使用沙丘编译代码。我的沙丘文件如下所示:
(executable
(name main)
(libraries lwt.unix lwt_ppx))
但是,当我运行该命令时dune exec ./main.exe
,我收到错误消息“未解释的扩展名‘lwt’。”
我已经验证我已经lwt_ppx
使用安装了该软件包,有趣的是,当我运行时,opam list
代码按预期工作:utop
#require "lwt_ppx";;
#require "lwt.unix";;
#use "main.ml";;
我的沙丘配置可能做错了什么?任何帮助将不胜感激。