我对SHA256的OCaml实现是否正常?

我是一个OCaml程序员新手,我想通过尝试实现一个非常复杂的算法,我会陷入困境。我愿意接受各种各样的批评,无论是在风格、安全性还是性能方面 我已经注意到的一个批评是,该算法需要将整个消息放入内存中(而SHA256的参考实现一次可以处理一个块) 我特别关心的是,是否有任何递归函数不是尾部递归的 我已经测试了代码,它确实在x86_64 Linux上生成了正确的消息摘要 提前感谢您的考虑 编辑: 如果没有什么事情发生在你身上,请不要在这里花太多时间。我要找的是明显不正常的行为,不是重写 let as_

Ocaml Int和负值

给出这段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

Ocaml 什么';有无反勾号的区别是什么`&引用;?

我可以删除这里的“`”吗 真诚的 这个问题很难回答是或否 可以删除反勾号和方括号。那你会的 type level = [ `Debug | `Info | `Warning | `Error] 在最简单的情况下,此类型非常类似于您的类型级别。它有4个常量构造函数 然而,在更复杂的情况下,类型却大不相同。您的类型level是一种比上面的level2更灵活的类型。level的构造函数可以出现在同一范围内的任意数量的不同类型中,level参与子类型关系: type level2 = Debug |

如何在Ocaml中实现工厂设计模式

如何以两种方式在Ocaml中实现factory设计模式: 函数和对象 F#得益于关键字“abstract”,因此它相当简单,但不是Ocaml包含Ocaml中各种设计模式的实现,包括抽象工厂和工厂方法模式 在实现抽象工厂模式的面向对象版本时,可以使用virtual关键字代替Abstract(在方法和类上) 包含OCaml中各种设计模式的实现,包括抽象工厂和工厂方法模式 在实现抽象工厂模式的面向对象版本时,可以使用virtual关键字代替Abstract(在方法和类上) 我认为这篇文章有点过时:“在

OCaml Printf.sprintf

为什么会发生这种行为 # 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

为什么d";OCaml scanf格式是否错误?

当我用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”匹配一个十进

Ocaml 访问模块下的类型

我向你解释我的问题 我有这样一个模块: 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获取机器上的内核数?

我正在并行化OCaml程序中的一些工作(使用parmap),但我不希望将内核数硬编码到我的应用程序中。有没有办法在运行时获得内核的数量?我不希望再添加任何依赖项(除了parmap或JS的core之外,没有其他依赖项)。我有一种感觉,我正在寻找一些简单的调用在stdlib 编辑:它不必是便携式的。在linux上工作已经足够好了。我也有同样的问题。这就是我最终得到的(我不想要C绑定): 如果您不想使用Unix,可以用Sys.command写入临时文件来替换open\u process\u in。在l

如何将OCaml字节码映射到其原始源代码位置?

从字节码的某个部分到它最初来自的代码行,格式或库是否有一些好的特性?这显然对调试和错误消息很有用 特别是,我正在研究添加对的支持有多困难 当编译时启用调试信息(选项-g),字节码携带所谓的“事件”结构,例如标记函数入口和返回点,提供源位置和键入信息 作为如何检查此信息的概念证明,我创建了一个工具(Benoît Vaugon提供的用于检查字节码文件的小型实用程序),它将此调试信息与字节码指令一起打印 我不知道在整个编译过程中,js\u of_ocaml是否采取了必要的步骤来保存此位置信息。您可能应

Ocaml树。我有这部分代码:[(aux(c+;1)l)@(aux(c+;1)r)]

有人能告诉我这个代码在我的程序中做什么吗? (辅(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/核心模块的惯用方法?

我在遵循使用核心库的真实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) |>

ocaml检查列表是否按顺序排序

我不知道该如何处理这个问题,但我需要检查列表是否按顺序排列 这就是我正在做的: 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中使用浮点变量?

为什么指数运算符在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

Ocaml定义类型并在函数中返回

假设我有以下几点: type person = string * int * int list let create_person name age grades = let new_person = person (name, age, grades) ;; 看,问题是,我试图创建一个人,添加字段,然后在这个函数中返回它。但我不确定如何实际使用我在上面定义的类型 person基本上只是string*int*int list的另一个名称,因此定义元组时不需要编写任何特殊的内容。

OCaml:更改元素后返回完整列表 背景:

在中,当将完整的列表作为参数时,假设方法更改迭代列表,如果在列表中成功搜索变量,则我们将该变量的绑定更改为另一个值。现在,我在底部有代码,,除了返回完整的列表外,所有操作都正确无误 为了清楚起见,最好将此列表看作包含元组的字典 问题: 我的表达式如何保存正在接收的列表,并在迭代时返回它?对于已识别的问题(如下所示),只返回了列表的一部分:这是表达式中的一个基本缺陷,还是一个简单的修复方法?如果这是一个简单的修复方法,那么在最终返回时可以添加什么来抛出它呢 代码: 代码示例: # let list

编写一个OCaml程序,检查矩阵A是否包含在矩阵B中

尽管Java没有遇到任何重大问题,但关于OCaml编程语言,我不能这样说。我应该创建一个函数subMat,对于两个矩阵,检查矩阵a是否是矩阵B的子矩阵,如果是,则返回true-val subMat:int list->int list->bool= 我非常感谢您的帮助,因为我真的不知道如何解决这个问题。这个问题可以通过使用int-array数组或Bigarray.Array2然后应用传统的命令式编程方法来解决 另一种方法是将矩阵连接到int list中,并应用子字符串查找算法,例如Knuth M

Ocaml 使用Camlp4解析一组通用量词和存在量词

我使用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

获取OCaml中两个列表之间的距离

假设我们有两个列表,[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

Ocaml 为什么编译器在(=)重载后总是需要此类型?

我有一个三天以来一直不明白的问题,因为我不明白,我无法解决它 我有这样的代码: module SpotLocation = struct type t = { uuid : string option; netElement : string; coordIntrinsic : float; } end module Segment = struct type t ={ netElement : string; coordFro

Ocaml lwt永无止境循环

我正在尝试用Lwt编写一个终端应用程序。 基本上,只要我的应用程序还在运行,我就需要用Lwt_io.read_线观察终端的输入 在我的程序运行时,有没有比下面的(伪代码)更好的方法来实现某种循环 while true do let _ = ignore (Lwt_main.run my_application) done 我不确定这是不是正确的方法。每次来自my_应用程序的所有线程都完成时,Lwt_main.run会被再次调用&再次&再次 使用Lwt是否有其他或更好的方法来处理此问题?您通

Ocaml-如何将int变量的值转换为字符串?

我想制作字符串“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循环。你的问题不清楚。

&引用;错误:未绑定模块";在OCaml中

下面是一个使用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中反转数组

所以我正在编写一个代码来在OCaml中反转数组,但我不知道为什么它不起作用。它给我带来语法错误 数组。(i)您缺少数组和之间的() 其他语法问题: 您需要在let之后的中输入(模块最外层除外) 两个赋值之间需要分号; 您缺少数组和之间的() 其他语法问题: 您需要在let之后的中输入(模块最外层除外) 两个赋值之间需要分号; 对不起,您有很多小错误。我看到的下一个错误是您在let之后的中缺少。两个作业表达式之间需要一个分号。我假设这是一个作业。因此,您希望了解OCaml,而不仅仅是让某人为您

如何在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

Ocaml 将字符串拆分为块

由于我在core或电池中看不到这方面的任何东西,所以我正在寻找一种有效的方法,将字节(或字符串,或任何方便的东西)分成约65k的块(我使用一个短的作为长度头,用于通过tcp发送)。 我自己也试过写这个函数,但是我遇到了麻烦,所以任何帮助都会很感激,或者指向现有函数的指针也可以。 谢谢 这里有一个函数,可以将字节值拆分为大小为65534的字节列表(当然最后一个除外) (值得考虑的是,在代码中传递整个字节值,同时计算到目前为止已写入的字节数。这将避免生成较小的块所需的复制。)这里有一个函数,可以将字

什么';ocamlc选项数据源的影响?

我不知道ocamlc的选项dsource的效果,-h选项告诉我它没有文档记录 我知道dparsetree和dtypedtree的用法,它可以显示ast 我尝试使用选项dsource,对一个文件test.ml,它似乎返回给我源代码,没有空行和注释,并在底部告诉我源代码的警告 这是选项dsource的效果吗?谢谢 我刚刚花了几分钟的时间浏览了OCaml编译器的源代码,下面是我的发现 -dsource命令行标志将Clflags模块中的dump\u source字段设置为true 此设置反过来会导致编译

如何在OCaml中实现以下模式匹配?

在一个给定的列表上,我想设计一个模式匹配用例,它看起来像这样a::b::ca应被视为单个元素,而b应被视为n个元素c是一种特定类型。此外,我想继续使用a、b和c 那么,有没有办法设计一个像这样构建的模式呢?1element::neelement::type你不能。列表的模式匹配没有“中间”元素 以下模式: | "lorem" :: "ipsum" :: rest -> ... 将分别与至少两个元素匹配的字符串列表进行匹配, “lorem”和“ipsum”并将rest绑定到列表的其余部分

Ocaml 什么';之间的区别是->;和|>;在reasonml中?

一段时间的谷歌搜索为我提供了一些例子,人们在一个代码中使用两种类型的运算符,但通常它们看起来就像做一件事的两种方式,它们甚至有相同的名称。|>通常被称为“管道前进”。它是一个辅助函数,在更广泛的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中调用?

我试图在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

lubuntu在NixOS上看不到ocamlopt生成的可执行文件

我使用带有选项-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

关键词";在;在Ocaml中

我不明白这段代码是如何得到“z”的值的: 一般来说,当我们有多个函数时,我无法理解“In”子句是如何工作的。注意,让内部z=x+z相当于(或语法糖) 请参阅Ocaml手册的和部分 因此,您的内部y函数应用程序(在最后一行)将z绑定到y的值。中的不是指令,而是关键字。。。。阅读顺便说一句,我不明白你的问题。还要学习用Ocaml编码的开源程序(包括Ocaml标准库)的源代码,以获得启发 let outer x y = let inner z = x + z in inner y ;; l

Ocaml 函子实现问题

下面描述的模块的目的是实现一个模块,该模块一旦由整数n启动,就会根据n的值执行所有操作 module ReturnSetZero = functor ( Elt : int ) -> struct let rec sublist b e l = match l with [] -> failwith "sublist" | h :: t -> let ta

Ocaml:语法错误

我试图弄明白为什么这不起作用,我得到一个错误:语法错误。我在什么地方错过了一个“;”吗 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

Ocaml 为什么Array.map比tail递归map(相当)快?

我编写了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.

Ocaml 什么';这个函数怎么了?

错误:分析错误:[module_longident]应在“.”之后(在中) [module_longident]) 我看不出有什么不对劲 我在utop中使用Core.StdopenedInt.min\u value和Int.max\u value是值,而不是构造函数(构造函数的名称大写,值的名称不大写) 不能在模式匹配中使用值,只能使用构造函数 好的代码是 let minus = function | Int.min_value, _ | Int.max_value, _ | _, In

ocaml的二叉参考树查找

我正在构建一个二元引用树,其中右叶节点查找左叶节点上的节点,如果所有右叶节点与一些左叶节点匹配,则返回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 (

Ocaml 如何将命名字符串类型强制转换为字符串

我有一个命名字符串类型: 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 制作isPrime函数时遇到的麻烦

这是一个家庭作业。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

ocamlfind:Package`core';找不到

我使用opam安装了core,在bash环境中添加了opam配置, 但我无法使用核心模块(模块已安装)编译程序: 如果我找到了ocamlfind list,我就看不到列表中的包(core) 原因可能是什么?看起来您使用的ocamlfind实用程序不是来自opam,而是来自您的系统,因此它看不到opam安装的内容。这是opam停用的常见症状。尝试激活它,以便PATH变量将包含指向正确ocamlfind的路径: eval `opam config env` eval$(opam配置环境) eval

带有嵌套记录的OCaml功能更新

有没有可能使用ppx扩展或类似的方法,将函数更新语法{record with key=value}与嵌套记录一起使用 例如,在下面的示例程序中,我只在功能上更新最外层的记录,而实际上我想将目标锁定为“内部”记录 如果内部有多个字段,则不太方便 我希望能够编写如下内容(strawman语法): 您可以直接用OCaml编写: { item with b = { item.b with c = 0.8 } } 我假设您使用的是ignore,仅用于示例;忽略功能记录更新的结果是没有意义的。从某种意义上

OCaml Cmdliner非标准参数

我正在用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

ocamlctypes-如何使指针指向指针

在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:Can';找不到版本

当我输入ocaml--version时,它返回 /usr/bin/ocaml: unknown option '--version'. 我使用OPAM安装了它,并运行了说明 opam初始化 估价$(opam环境) 评估opam环境 opam交换机创建4.07.0 一切似乎都很顺利。输入哪个ocaml返回正确的查找路径。当进入终端会话时,它似乎工作正常。在搜索时,我没有看到在任何地方提到过这个错误。OCaml工具很奇怪,通常不遵循POSIX指南,即在命令行选项中使用双破折号。此时,可能是出于历史

Ocaml`new`关键字

在一些代码中,我将介绍其用法: Lwt_engine.set (new Lwt_engine.libev ()) 在此上下文中,关键字new是什么意思 我认为这与对象系统有关?你说得对,Lwt\u引擎。libev是一个类。调用new Lwt\u engine.libev()将在该类中创建一个新对象。您正在模块Lwt\u engine中创建类libev的一个新实例。

为什么将OCaml类型转换函数命名为;“A”或“B”中的“U”;?

像“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 这里有没有减少重复的方法?

我正在创建一个囚徒困境模拟,我有两个函数,计算两个玩家的合作和背叛,并将它们作为元组输出。我看到了很多相似之处,并希望获得一些关于如何将这两个函数合并为另一个函数的指导,以便这两个函数可以调用,这样我就不会重用代码了。我对OCaml非常陌生,所以我正在努力找到一种方法来做到这一点 以下是必要的信息: type action = bool ;; type play = action * action ;; type history = play list let rec count_defec

如何在Ocaml中打印另一个函数中函数的返回值?

我有一个函数,它返回一个数的一半,如果它是偶数 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中分解2-3-4树

我想把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 页