标签: Ocaml
digestsha256sha
我是一个OCaml程序员新手,我想通过尝试实现一个非常复杂的算法,我会陷入困境。我愿意接受各种各样的批评,无论是在风格、安全性还是性能方面
我已经注意到的一个批评是,该算法需要将整个消息放入内存中(而SHA256的参考实现一次可以处理一个块)
我特别关心的是,是否有任何递归函数不是尾部递归的
我已经测试了代码,它确实在x86_64 Linux上生成了正确的消息摘要
提前感谢您的考虑
编辑:
如果没有什么事情发生在你身上,请不要在这里花太多时间。我要找的是明显不正常的行为,不是重写
let as_
给出这段OCaml代码:
let rec range a b =
if a > b then []
else a :: range (a+1) b
;;
Repl告诉我它的类型是:
val range : int -> int -> int list = <fun>
返回列表:
- : int list = [0; 1; 2; 3; 4]
然而,提供输入
range -4 2;;
给出了错误:
Characters 0-5:
range -4
我可以删除这里的“`”吗
真诚的 这个问题很难回答是或否
可以删除反勾号和方括号。那你会的
type level =
[ `Debug
| `Info
| `Warning
| `Error]
在最简单的情况下,此类型非常类似于您的类型级别。它有4个常量构造函数
然而,在更复杂的情况下,类型却大不相同。您的类型level是一种比上面的level2更灵活的类型。level的构造函数可以出现在同一范围内的任意数量的不同类型中,level参与子类型关系:
type level2 = Debug |
标签: Ocaml
factory-pattern
如何以两种方式在Ocaml中实现factory设计模式:
函数和对象
F#得益于关键字“abstract”,因此它相当简单,但不是Ocaml包含Ocaml中各种设计模式的实现,包括抽象工厂和工厂方法模式
在实现抽象工厂模式的面向对象版本时,可以使用virtual关键字代替Abstract(在方法和类上) 包含OCaml中各种设计模式的实现,包括抽象工厂和工厂方法模式
在实现抽象工厂模式的面向对象版本时,可以使用virtual关键字代替Abstract(在方法和类上) 我认为这篇文章有点过时:“在
标签: Ocaml
printftype-systems
为什么会发生这种行为
# Printf.sprintf ("Foo %d %s") 2 "bar";;
- : string = "Foo 2 bar"
# Printf.sprintf ("Foo %d" ^ " %s") 2 "bar";;
Printf.sprintf ("Foo %d" ^ " %s") 2 "bar";;
Error: This expression has type string but an expression was expected of type
当我用ocaml实现read_int函数时(见下文)
如果format参数为%d(无空格),编译器将返回failure,其中包含以下信息:
Exception:
Scanf.Scan_failure
"scanf: bad input at char number 1: ``character '\\n' is not a decimal digit''".
但是如果我使用''%d(前缀加空格),这很好,为什么%d是错误的呢?%d和''%d之间有什么区别。谢谢。scanf格式%d”匹配一个十进
我向你解释我的问题
我有这样一个模块:
a、 毫升
a、 姆利
main.ml
let test = A.t(8, 9)
如何解决此错误:
Error: Unbound value A.t
谢谢。A.t是一种类型,因此A.t(8,9)没有什么意义。这与模块无关,您可以通过以下方式获得相同的结果:
# type t = int*int;;
type t = int * int
# t (1,2);;
Error: Unbound value t
我也有这个错误:错误:Unbound Cons
我正在并行化OCaml程序中的一些工作(使用parmap),但我不希望将内核数硬编码到我的应用程序中。有没有办法在运行时获得内核的数量?我不希望再添加任何依赖项(除了parmap或JS的core之外,没有其他依赖项)。我有一种感觉,我正在寻找一些简单的调用在stdlib
编辑:它不必是便携式的。在linux上工作已经足够好了。我也有同样的问题。这就是我最终得到的(我不想要C绑定):
如果您不想使用Unix,可以用Sys.command写入临时文件来替换open\u process\u in。在l
标签: Ocaml
source-mapsjs-of-ocaml
从字节码的某个部分到它最初来自的代码行,格式或库是否有一些好的特性?这显然对调试和错误消息很有用
特别是,我正在研究添加对的支持有多困难 当编译时启用调试信息(选项-g),字节码携带所谓的“事件”结构,例如标记函数入口和返回点,提供源位置和键入信息
作为如何检查此信息的概念证明,我创建了一个工具(Benoît Vaugon提供的用于检查字节码文件的小型实用程序),它将此调试信息与字节码指令一起打印
我不知道在整个编译过程中,js\u of_ocaml是否采取了必要的步骤来保存此位置信息。您可能应
有人能告诉我这个代码在我的程序中做什么吗?
(辅(c+1)l)@(辅(c+1)r)
以下是所有代码:
let rec aux c = function
Empty -> []
|Tr(x,l,r) ->
let l =
(aux (c+1) l)@(aux (c+1) r) in
if c = n then x::l else l
in aux 1 tr;;
您遗漏了一些定义n和tr的上下文。我还要说,你的问题很
我在遵循使用核心库的真实OCaml时编写了以下函数
open Core.Core_list
open Core.Option
open Core.Std
open Re2
let getMaxFilename target =
let Ok pat = Regex.create "^.*(..)\\.txt$" in
Sys.ls_dir target |>
List.map ~f:(Regex.find_submatches pat) |>
我不知道该如何处理这个问题,但我需要检查列表是否按顺序排列
这就是我正在做的:
let rec is_sorted_aux l res = match l with
[] -> res
| (h1::h2::t) ->
if (h2 > h1) then
is_sorted_aux t false
else
is_sorted_aux t true
;;
但这是比较1&&2、3&&4等中的元素对,而不是所有元素都与它们的邻
为什么指数运算符在OCaml中使用浮点变量?
它不应该也允许int变量吗
# 3**3;;
Error: This expression has type int but an expression was expected of type
float
作品:
# 3.0**3.0;;
- : float = 27.
您可以使用int
let int_exp x y = (float_of_int x) ** (float_of_int y) |> int_of_fl
假设我有以下几点:
type person = string * int * int list
let create_person name age grades =
let new_person = person (name, age, grades)
;;
看,问题是,我试图创建一个人,添加字段,然后在这个函数中返回它。但我不确定如何实际使用我在上面定义的类型 person基本上只是string*int*int list的另一个名称,因此定义元组时不需要编写任何特殊的内容。
在中,当将完整的列表作为参数时,假设方法更改迭代列表,如果在列表中成功搜索变量,则我们将该变量的绑定更改为另一个值。现在,我在底部有代码,,除了返回完整的列表外,所有操作都正确无误
为了清楚起见,最好将此列表看作包含元组的字典
问题:
我的表达式如何保存正在接收的列表,并在迭代时返回它?对于已识别的问题(如下所示),只返回了列表的一部分:这是表达式中的一个基本缺陷,还是一个简单的修复方法?如果这是一个简单的修复方法,那么在最终返回时可以添加什么来抛出它呢
代码:
代码示例:
# let list
尽管Java没有遇到任何重大问题,但关于OCaml编程语言,我不能这样说。我应该创建一个函数subMat,对于两个矩阵,检查矩阵a是否是矩阵B的子矩阵,如果是,则返回true-val subMat:int list->int list->bool=
我非常感谢您的帮助,因为我真的不知道如何解决这个问题。这个问题可以通过使用int-array数组或Bigarray.Array2然后应用传统的命令式编程方法来解决
另一种方法是将矩阵连接到int list中,并应用子字符串查找算法,例如Knuth M
我试图创建Lwt的并发示例,并提出了这个小示例
let () =
Lwt_main.run (
let start = Unix.time () in
Lwt_io.open_file Lwt_io.Input "/dev/urandom" >>= fun data_source ->
Lwt_unix.mkdir "serial" 0o777 >>= fun () ->
Lwt_list.iter_p
我使用Camlp4解析一个量词字符串,其中量化关键字和变量用逗号分隔。一个例子如下:
exists x,y,z, forall a,b, exists h,k
这里,存在和因为所有都是关键字,x、y、z、a、b、h、k都是标识符。相应的令牌是存在,用于所有和字符串标识符
我的数据结构:
type quantifier =
| Exists of string
| Forall of string
要分析上面的量词字符串,我的规则是:
id: [[
`IDENTIFIER s-&g
假设我们有两个列表,[3;4;5]和[1;2;3],如何得到12的距离,这是通过从第一个列表中减去第二个列表,然后平方得到的。所以(3-1)^2+(4-2)^2+(5-3)^2。目前,我有以下方法来解决这个问题:
List.map (List.map (fun x -> x*x)) [[1; 2]; [2; 3]];;
但是我怎样才能把它们加在一起呢?上面的序列只返回[[1;4];[4;9]]
谢谢。借用下列整数幂函数:
你的例子是:
utop[58]> distance [3;4
我有一个三天以来一直不明白的问题,因为我不明白,我无法解决它
我有这样的代码:
module SpotLocation = struct
type t = {
uuid : string option;
netElement : string;
coordIntrinsic : float;
}
end
module Segment = struct
type t ={
netElement : string;
coordFro
我正在尝试用Lwt编写一个终端应用程序。
基本上,只要我的应用程序还在运行,我就需要用Lwt_io.read_线观察终端的输入
在我的程序运行时,有没有比下面的(伪代码)更好的方法来实现某种循环
while true do
let _ = ignore (Lwt_main.run my_application)
done
我不确定这是不是正确的方法。每次来自my_应用程序的所有线程都完成时,Lwt_main.run会被再次调用&再次&再次
使用Lwt是否有其他或更好的方法来处理此问题?您通
我想制作字符串“t1”,“t2”,“t3”,等等
所以我喜欢这个
设i=0;。。。
(某物)->让z=“t”^string\u of_int(i+1)
我的意图是每次程序进入(某物),我都会增加。
因为我必须在程序输入(某物)时生成新字符串
但它有语法错误
我该怎么办 如果要将整数嵌入字符串的一部分,请使用Printf.sprint f:
let make_string i =
Printf.sprintf "t%d" i
你必须处理产生越来越多数字的部分,比如for循环。你的问题不清楚。
下面是一个使用Cohttp库的简单示例:
open Lwt
open Cohttp
open Cohttp_lwt_unix
let body =
Client.get (Uri.of_string "http://www.reddit.com/") >>= fun (resp, body) ->
let code = resp |> Response.status |> Code.code_of_status in
Printf.printf "Re
所以我正在编写一个代码来在OCaml中反转数组,但我不知道为什么它不起作用。它给我带来语法错误
数组。(i)您缺少数组和之间的()
其他语法问题:
您需要在let之后的中输入(模块最外层除外)
两个赋值之间需要分号;
您缺少数组和之间的()
其他语法问题:
您需要在let之后的中输入(模块最外层除外)
两个赋值之间需要分号;
对不起,您有很多小错误。我看到的下一个错误是您在let之后的中缺少。两个作业表达式之间需要一个分号。我假设这是一个作业。因此,您希望了解OCaml,而不仅仅是让某人为您
我的源代码位于生成目录旁边
ocamlc -c file1.ml
ocamlc -c file2.ml
…
ocamlc -o main.ml ….cmo
我有编译生成的文件的源代码
我想要一个ocamlc选项,使我能够将此文件保存在构建目录中
我知道我可以执行ocamlc-o build/main.ml…..cmo,但我也希望必须执行build目录中的.cmo
感谢您的帮助您主要问题的答案非常简单:
要将OCaml应用程序的主二进制文件放入build文件夹中,只需运行:
ocamlc -o
由于我在core或电池中看不到这方面的任何东西,所以我正在寻找一种有效的方法,将字节(或字符串,或任何方便的东西)分成约65k的块(我使用一个短的作为长度头,用于通过tcp发送)。
我自己也试过写这个函数,但是我遇到了麻烦,所以任何帮助都会很感激,或者指向现有函数的指针也可以。
谢谢 这里有一个函数,可以将字节值拆分为大小为65534的字节列表(当然最后一个除外)
(值得考虑的是,在代码中传递整个字节值,同时计算到目前为止已写入的字节数。这将避免生成较小的块所需的复制。)这里有一个函数,可以将字
我不知道ocamlc的选项dsource的效果,-h选项告诉我它没有文档记录
我知道dparsetree和dtypedtree的用法,它可以显示ast
我尝试使用选项dsource,对一个文件test.ml,它似乎返回给我源代码,没有空行和注释,并在底部告诉我源代码的警告
这是选项dsource的效果吗?谢谢 我刚刚花了几分钟的时间浏览了OCaml编译器的源代码,下面是我的发现
-dsource命令行标志将Clflags模块中的dump\u source字段设置为true
此设置反过来会导致编译
在一个给定的列表上,我想设计一个模式匹配用例,它看起来像这样a::b::ca应被视为单个元素,而b应被视为n个元素c是一种特定类型。此外,我想继续使用a、b和c
那么,有没有办法设计一个像这样构建的模式呢?1element::neelement::type你不能。列表的模式匹配没有“中间”元素
以下模式:
| "lorem" :: "ipsum" :: rest -> ...
将分别与至少两个元素匹配的字符串列表进行匹配,
“lorem”和“ipsum”并将rest绑定到列表的其余部分
标签: Ocaml
pipelinereasonbucklescript
一段时间的谷歌搜索为我提供了一些例子,人们在一个代码中使用两种类型的运算符,但通常它们看起来就像做一件事的两种方式,它们甚至有相同的名称。|>通常被称为“管道前进”。它是一个辅助函数,在更广泛的OCaml社区中使用,而不仅仅是RationalML。它将左边的参数作为最后一个参数“注入”到右边的函数中:
0 |> f == f(0)
0 |> g(1) == g(1, 0)
0 |> h(1, 2) == h(1, 2, 0)
// and so on
0 -
我试图在OCaml中的函数中保存一个值,以便下次调用该函数时可以访问该值。有什么方法可以做到这一点吗?你不能用函数的方式来实现,因为函数不是纯函数
您可以使用ref来存储所需的值,并在函数中对其进行变异
例如,此函数计算a+b+X,其中X每次调用该函数时增加1:
让我的_发挥作用=
让保存的_值=中的参考值0
乐趣a b->
保存的值:=!保存的_值+1;(*增加值*)
a+b+!保存值
let()=Printf.Printf“First:%d\n”(my_函数12)(*1+2+1==4*)
l
标签: Ocaml
x86-64executablenixos
我使用带有选项-linkall的“ocamlopt”本机编译器在NixOS(x86_64)中创建了可执行文件“standalone”。生成的程序在NixOS中执行。到目前为止还不错
之后,我尝试在Lubuntu下执行此文件
lubuntu@lubuntu:~/Documents$ uname -a
Linux lubuntu 4.18.0-10-generic #11-Ubuntu SMP Thu Oct 11 15:13:55 UTC 2018 x86_64 x86_64 x86_64 GNU
我不明白这段代码是如何得到“z”的值的:
一般来说,当我们有多个函数时,我无法理解“In”子句是如何工作的。注意,让内部z=x+z相当于(或语法糖)
请参阅Ocaml手册的和部分
因此,您的内部y函数应用程序(在最后一行)将z绑定到y的值。中的不是指令,而是关键字。。。。阅读顺便说一句,我不明白你的问题。还要学习用Ocaml编码的开源程序(包括Ocaml标准库)的源代码,以获得启发
let outer x y =
let inner z = x + z
in inner y ;;
l
下面描述的模块的目的是实现一个模块,该模块一旦由整数n启动,就会根据n的值执行所有操作
module ReturnSetZero =
functor ( Elt : int ) ->
struct
let rec sublist b e l =
match l with
[] -> failwith "sublist"
| h :: t ->
let ta
我试图弄明白为什么这不起作用,我得到一个错误:语法错误。我在什么地方错过了一个“;”吗
let way_tags_to_hashtbl way =
let hashtbl = Hashtbl.create 1 in
let rec way_tags_to_hashtbl_partial list = match list with
| a::list' -> Hashtbl.add hashtbl (a.k, a.v); way_tags_to_hashtbl_partia
我编写了map\u tail的尾部递归版本,如下所示:
let map_tail f l =
let rec map acc = function
| [] -> List.rev acc
| hd::tl -> map (f hd :: acc) tl
in
map [] l
然后是一个基于数组的逐数组映射:
let map_by_array f l =
Array.of_list l |> Array.map f |> Array.
错误:分析错误:[module_longident]应在“.”之后(在中)
[module_longident])
我看不出有什么不对劲
我在utop中使用Core.StdopenedInt.min\u value和Int.max\u value是值,而不是构造函数(构造函数的名称大写,值的名称不大写)
不能在模式匹配中使用值,只能使用构造函数
好的代码是
let minus = function
| Int.min_value, _ | Int.max_value, _ | _, In
我正在构建一个二元引用树,其中右叶节点查找左叶节点上的节点,如果所有右叶节点与一些左叶节点匹配,则返回true
type exp = V of var
| P of var * exp
and var = string
但在这里,我一直在第5行遇到错误:
let rec ctree : exp * exp -> bool
=fun (e1,e2) -> match e2 with
| P (x,y) -> match y with
| P (
我有一个命名字符串类型:
type t = string
所以我可以这样做:
let (x:t) = "Hello";;
(* val x : t = "Hello" *)
x ^ "Hi";;
(* - : t = "HelloHi" *)
我的问题是如何将字符串x返回到type string,以便在其他地方将其用作字符串
主要限制是我不想将类型t更改为使用如下构造函数:
type t = StringType of string
我想做的事情可能吗?正如@PierreG所说,您的类型t
这是一个家庭作业。OCaml似乎是由一个精神病患者制作的
let prime : int -> bool
= fun n ->
if n > 2 then
let a = n - 1 in
let rec divisor n a =
if a > 1 && n mod a = 0 then false
else if a = 2 && n mod a
我使用opam安装了core,在bash环境中添加了opam配置,
但我无法使用核心模块(模块已安装)编译程序:
如果我找到了ocamlfind list,我就看不到列表中的包(core)
原因可能是什么?看起来您使用的ocamlfind实用程序不是来自opam,而是来自您的系统,因此它看不到opam安装的内容。这是opam停用的常见症状。尝试激活它,以便PATH变量将包含指向正确ocamlfind的路径:
eval `opam config env`
eval$(opam配置环境)
eval
有没有可能使用ppx扩展或类似的方法,将函数更新语法{record with key=value}与嵌套记录一起使用
例如,在下面的示例程序中,我只在功能上更新最外层的记录,而实际上我想将目标锁定为“内部”记录
如果内部有多个字段,则不太方便
我希望能够编写如下内容(strawman语法):
您可以直接用OCaml编写:
{ item with b = { item.b with c = 0.8 } }
我假设您使用的是ignore,仅用于示例;忽略功能记录更新的结果是没有意义的。从某种意义上
这是我目前为运行正常的mll文件准备的
{ type token = EOF | Word of string }
rule token = parse
| eof { EOF }
| ['a'-'z' 'A'-'Z']+ as word {Word(word)}
| _ { token lexbuf }
{
let lexbuf = Lexing.from_channel stdin in
let wordlist =
let rec
我正在用Cmdliner制作一个OCaml编译器前端,我想复制一些Clang的行为,比如-emit llvm选项。目前我得到的代码是:
(* Whether to generate LLVM (IR or bitcode) output. *)
let llvm =
let doc = "In conjunction with -S or -c, generate LLVM output instead of
native output. For an objec
在C语言中,如果有一个类似int myfuncstruct mystruct**context的函数,那么
OCaml国外签名将被删除
类型mystruct
让mystruct:mystruct structure typ=结构mystruct
让myfunc=foreign myfunc ptr ptr mystruct@->返回int
问题是如何调用函数?我们无法接受addr addr mystructinstance,因此代码无法编译:
让inst=使我的指令生效
设res=myfunc
当我输入ocaml--version时,它返回
/usr/bin/ocaml: unknown option '--version'.
我使用OPAM安装了它,并运行了说明
opam初始化
估价$(opam环境)
评估opam环境
opam交换机创建4.07.0
一切似乎都很顺利。输入哪个ocaml返回正确的查找路径。当进入终端会话时,它似乎工作正常。在搜索时,我没有看到在任何地方提到过这个错误。OCaml工具很奇怪,通常不遵循POSIX指南,即在命令行选项中使用双破折号。此时,可能是出于历史
在一些代码中,我将介绍其用法:
Lwt_engine.set (new Lwt_engine.libev ())
在此上下文中,关键字new是什么意思
我认为这与对象系统有关?你说得对,Lwt\u引擎。libev是一个类。调用new Lwt\u engine.libev()将在该类中创建一个新对象。您正在模块Lwt\u engine中创建类libev的一个新实例。
像“A_of_B”这样的名称在OCaml中是一种独特的命名约定,但我想知道为什么。这是因为法语和英语的语言用法不同吗?还是Xavier Leroy的个人偏好
背景:我发现OCaml的类型转换函数的名称类似于Stdlib模块中的A\u of_B,例如,int\u of_string:string->int或float\u of_int:int->float。其他流行语言使用的名称如AtoB,例如,C中的itoa函数。我的猜测是,当使用函数作为值时,它的可读性更高,例如使用高阶函数,如函数组合:
#
我正在创建一个囚徒困境模拟,我有两个函数,计算两个玩家的合作和背叛,并将它们作为元组输出。我看到了很多相似之处,并希望获得一些关于如何将这两个函数合并为另一个函数的指导,以便这两个函数可以调用,这样我就不会重用代码了。我对OCaml非常陌生,所以我正在努力找到一种方法来做到这一点
以下是必要的信息:
type action = bool ;;
type play = action * action ;;
type history = play list
let rec count_defec
我有一个函数,它返回一个数的一半,如果它是偶数
let regraUm m = if ((m mod 2) = 0) then m/2 else m;;
我想在另一个函数中或*.ml文件中的某个地方打印regraUm 250
示例:let\uf=printf let m=regraUm 250
完整代码:
open Printf
open Format
let regraUm m = if ((m mod 2) = 0) then m/2 else m;;
let _ = printf le
标签: Ocaml
red-black-tree2-3-4-tree
我想把2-3-4树分解成小节点
以下是我正在使用的类型:
类型ele=int
类型颜色=红色|黑色
ab型=Vide |节点(ele*color*ab*ab*ab)
ab234型=参考
|节点_1(ele*ab234*ab234)
|(ele*ele*ab234*ab234*ab234)的节点_2``
|节点_3(ele*ele*ele*ab234*ab234*ab234*ab234*ab234)
我的映射基于以下内容:
我需要帮助做我的转变。我尝试使用此函数,但它似乎不起作用,它确实会分解
1 2 3 4 5 6 ...
下一页 最后一页 共 43 页