标签: ocaml

寻找OCaml IDE

我喜欢F#,但有时候我需要一些轻量级和跨平台的东西,而且没有.NET.我试过多次使用OCamL,但似乎我无法启动它.

  1. 安装了IDEA,添加了OCamL插件 - >不起作用
  2. 安装eclipse ODT插件 - >无法启动甚至配置OCamL编译器 - 太复杂了
  3. 甚至在很久以前就尝试过NetBeans插件,但即使不能处理它.

所以,现在,我正在从命令shell和不同的光编辑器使用ocamlc -o"main.exe""main.ml".我不使用Vim或Emacs,我使用的是nano,我习惯使用全功能的IDE.

我找到了各种文档(这对我来说是最好的启动http://caml.inria.fr/pub/docs/oreilly-book/html/index.html)但是在寻找一些特定的东西时仍然会让人感到困惑相似的sqlite访问.发现这个:http://neugierig.org/software/ocaml/sqlite/有奇怪的api注释,没有例子.我发现的有关IDE使用的所有文档都已过时或无效.

添加子问题:有些人告诉我"不要使用OCamL,对于拥有低库支持的学生来说,这是一种死语言,似乎就像死了一样,使用python或ruby代替".但我喜欢OCamL的美丽.我想尝试一下.告诉我今天使用OCamL生产代码是否正常?

谢谢.

ide ocaml typerex

21
推荐指数
2
解决办法
1万
查看次数

OCaml中的拓扑排序

我正在尝试在ocaml中编写拓扑排序,但我是初学者(在OCaml和图算法中),我不能自己做.

我更容易考虑拓扑排序,例如C++(并且在互联网上有很多关于C++拓扑排序的例子),但我想学习一些新东西.此外,我已经找到了一些用OCaml编写的拓扑排序的例子,坦率地说,我不明白它们.

假设我有一个列表(int * int list) list,例如:

myList = [(1, [2]); (5, [6; 7]); (3, [2]); (6, [3; 7]); (8, [7]); (4, [3; 1])];;

这意味着,我需要"做"任务1任务之前2,任务4任务之前31

我想,这个列表的输出应该是:

[8; 5; 6; 7; 4; 3; 1; 2]

(但我不确定,因为我刚刚做了这个例子,所以如果我错了,请纠正我)

另外,我已经读过,拓扑排序对于图中的循环不起作用,因此循环必须有某种条件 - 当给定图形有循环时,我们引发异常(我认为这是一个好主意) .

AFAIK,我需要在算法中使用DFS进行拓扑排序,其中(DFS)我不知道如何在OCaml中实现(我理解主要思想,但我不觉得,这在OCaml /函数编程中是如何工作的).

我非常感谢你帮助我理解这个概念(我的意思是拓扑排序,OCaml /函数编程中的DFS).如果可以的话,如果您向我展示示例代码,那将会很棒,因为阅读代码(对我来说)是理解算法概念的最佳方法.

我知道,对于大多数人来说,这是一个简单的问题,但我希望,它不会阻止你帮助我.

PS:我自己学习OCaml(我在高中),所以我没有扎实的理论背景(在OCaml或算法中).我开始学习OCaml,因为我想理解递归概念,现在这种语言看起来很有趣,因为它与C++真的不同,所以我还在尝试学习OCaml中的新东西.

algorithm ocaml topological-sort

20
推荐指数
2
解决办法
3901
查看次数

是否可以在OCaml中使用管道?

在F#我不能没有管道(<||>)

let console(dashboard : Dashboard ref) = 
    let rec eat (command : string) =
        command.Split(' ','(',')') 
        |> Seq.filter(fun s -> s.Length <> 0)
        |> fun C ->
            (Seq.head C).ToUpper() |> fun head ->
Run Code Online (Sandbox Code Playgroud)

我可以使用<||>OCaml中?

syntax ocaml

20
推荐指数
1
解决办法
3275
查看次数

OCaml调用约定:这是一个准确的摘要吗?

我一直在尝试找到OCaml调用约定,以便我可以手动解释gdb无法解析的堆栈跟踪.不幸的是,除了一般观察之外,似乎没有任何东西用英文写下来.例如,人们会在博客上评论OCaml在寄存器中传递了许多参数.(如果某处有英文文档,我们非常感谢链接.)

所以我一直试图从ocamlopt源码中解开它.任何人都可以确认这些猜测的准确性吗?

并且,如果我对在寄存器中传递的前十个参数是对的,那么通常不可能将参数恢复到函数调用吗?在C中,如果只是向后走到正确的帧,参数仍会被推到堆栈的某个地方.在OCaml中,似乎被调用者可以自由地破坏他们的呼叫者的论点.


注册分配(来自/asmcomp/amd64/proc.ml)

为了调用OCaml函数,

  • 前10个整数和指针参数在寄存器rax,rbx,rdi,rsi,rdx,rcx,r8,r9,r10和r11中传递
  • 前10个浮点参数在寄存器xmm0 - xmm9中传递
  • 其他参数被压入堆栈(最左边的第一个?),浮点数和整数和指针混合在一起
  • 陷阱指针(参见下面的例外)在r14中传递
  • 在r15中传递分配指针(可能是本博客文章中描述的次要堆)
  • 如果返回值是整数或指针,则返回值在rax中传递;如果是float,则返回xmm0
  • 所有寄存器都是来电保存?

要调用C函数,使用标准的amd64 C约定:

  • 前六个整数和指针参数在rdi,rsi,rdx,rcs,r8和r9中传递
  • 前8个浮点参数在xmm0 - xmm7中传递
  • 其他参数被压入堆栈
  • 返回值以rax或xmm0传回
  • 寄存器rbx,rbp和r12-r15是被调用者保存的

退货地址(自/asmcomp/amd64/emit.mlp)

返回地址是按照amd64 C约定推入调用帧的第一个指针.(我猜这个ret指令假定这个布局.)

例外(来自/asmcomp/linearize.ml)

代码try (...body...) with (...handler...); (...rest...)线性化如下:

Lsetuptrap .body
(...handler...)
Lbranch .join
Llabel .body
Lpushtrap
(...body...)
Lpoptrap
Llabel .join
(...rest...)
Run Code Online (Sandbox Code Playgroud)

然后像这样发出组件(右边的目的地):

call .body
(...handler...)
jmp .join
.body:
pushq %r14
movq %rsp, %r14
(...body...)
popq %r14
addq %rsp, 8 …
Run Code Online (Sandbox Code Playgroud)

ocaml

20
推荐指数
1
解决办法
939
查看次数

是否可以在OCaml解释器中使用箭头键?

每次我在解释器中使用这些键时,我都会看到这样的符号出现:

[[D^[[C
Run Code Online (Sandbox Code Playgroud)

我在ZSH中使用Linux Mint 12,但是我在使用bash的Ubuntu中获得了相同的结果.另外,在ssh中也是如此.

interpreter ocaml arrow-keys ledit

20
推荐指数
2
解决办法
3801
查看次数

如何在ocamlbuild中使用-thread编译器标志?

我现在用Jane Streetasync_corepackage(async_core)_tags.

当我使用时ocamlbuild -use-ocamlfind -I src test/test_airport.native,它给我以下错误:

camlfind ocamlopt -linkpkg -package async_core -package unix -package netclient -package mongo -package xml-light src/airport.cmx test/test_airport.cmx -o test/test_airport.native ocamlfind:包'threads'出错:缺少-thread或-vmthread开关


我用谷歌搜索了这里是我得到的http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual039.html

它说:

使用系统线程的程序必须按如下方式链接:

    ocamlc -thread other options unix.cma threads.cma other files
Run Code Online (Sandbox Code Playgroud)

所以我改变了我的ocamlbuild命令,如下所示:

ocamlbuild -use-ocamlfind -cflag -thread -I src test/test_airport.native

但错误仍然相同.还有ocamlbuild生成的实际命令保持不变-thread.


我怎么处理这个?

ocaml ocamlbuild

20
推荐指数
1
解决办法
2638
查看次数

为什么OCaml有时需要进行eta扩展?

如果我有以下OCaml功能:

let myFun = CCVector.map ((+) 1);;
Run Code Online (Sandbox Code Playgroud)

它在Utop中运行良好,Merlin不会将其标记为编译错误.但是,当我尝试编译它时,我收到以下错误:

错误:此表达式的类型, (int,'_ a)CCVector.t - >(int,'_ b)CCVector.t,包含无法泛化的类型变量

如果我eta-expand它然后它编译好:

let myFun foo = CCVector.map ((+) 1) foo;;
Run Code Online (Sandbox Code Playgroud)

所以我想知道为什么它不能以eta-reduced形式编译,以及为什么eta-reduced表单似乎在顶层(Utop)中工作但在编译时不起作用?

哦,CCVector的文档就在这里.'_a部分可以是`RO或`RW,具体取决于它是只读还是可变.

ocaml haskell functional-programming

20
推荐指数
1
解决办法
1085
查看次数

如果有的话,您需要添加到依赖类型系统来获取模块系统吗?

依赖类型系统似乎支持ML模块系统的一些用途.你从模块系统中获得了什么,你没有从依赖记录中获得?

模块〜记录

签名〜记录类型

functor~记录功能

具有抽象类型组件的模块〜具有类型字段的依赖记录

我对它作为模块系统的工作情况感兴趣,以及是否以及如何集成应用程序仿函数和mixin等功能.

ocaml types module sml

20
推荐指数
1
解决办法
314
查看次数

什么是行类型?它们是代数数据类型吗?

我经常听说F#缺乏对OCaml行类型的支持,这使得语言比F#更强大.

这些是什么?它们是代数数据类型,例如总和类型(有区别的联合)还是产品类型(元组,记录)?是否可以在其他方言中写行类型,例如F#?

.net f# ocaml functional-programming

20
推荐指数
3
解决办法
1593
查看次数

OCaml是否具有通用map()/ reduce()函数?

在Python中,map()适用于遵循序列协议的任何数据.无论我是用字符串还是列表甚至元组提供它,它都能做出正确的事情.

我不能在OCaml吃蛋糕吗?除了查看我正在使用的集合类型并查找相应的List.map或Array.map或Buffer.map或String.map之外,我真的别无选择吗?其中一些甚至不存在!我要求的是不寻常的吗?我肯定错过了什么.

polymorphism reduce ocaml map

19
推荐指数
2
解决办法
2483
查看次数