我喜欢F#,但有时候我需要一些轻量级和跨平台的东西,而且没有.NET.我试过多次使用OCamL,但似乎我无法启动它.
所以,现在,我正在从命令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生产代码是否正常?
谢谢.
我正在尝试在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任务之前3和1等
我想,这个列表的输出应该是:
[8; 5; 6; 7; 4; 3; 1; 2]
(但我不确定,因为我刚刚做了这个例子,所以如果我错了,请纠正我)
另外,我已经读过,拓扑排序对于图中的循环不起作用,因此循环必须有某种条件 - 当给定图形有循环时,我们引发异常(我认为这是一个好主意) .
AFAIK,我需要在算法中使用DFS进行拓扑排序,其中(DFS)我不知道如何在OCaml中实现(我理解主要思想,但我不觉得,这在OCaml /函数编程中是如何工作的).
我非常感谢你帮助我理解这个概念(我的意思是拓扑排序,OCaml /函数编程中的DFS).如果可以的话,如果您向我展示示例代码,那将会很棒,因为阅读代码(对我来说)是理解算法概念的最佳方法.
我知道,对于大多数人来说,这是一个简单的问题,但我希望,它不会阻止你帮助我.
PS:我自己学习OCaml(我在高中),所以我没有扎实的理论背景(在OCaml或算法中).我开始学习OCaml,因为我想理解递归概念,现在这种语言看起来很有趣,因为它与C++真的不同,所以我还在尝试学习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中?
我一直在尝试找到OCaml调用约定,以便我可以手动解释gdb无法解析的堆栈跟踪.不幸的是,除了一般观察之外,似乎没有任何东西用英文写下来.例如,人们会在博客上评论OCaml在寄存器中传递了许多参数.(如果某处有英文文档,我们非常感谢链接.)
所以我一直试图从ocamlopt源码中解开它.任何人都可以确认这些猜测的准确性吗?
并且,如果我对在寄存器中传递的前十个参数是对的,那么通常不可能将参数恢复到函数调用吗?在C中,如果只是向后走到正确的帧,参数仍会被推到堆栈的某个地方.在OCaml中,似乎被调用者可以自由地破坏他们的呼叫者的论点.
注册分配(来自/asmcomp/amd64/proc.ml)
为了调用OCaml函数,
要调用C函数,使用标准的amd64 C约定:
退货地址(自/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) 每次我在解释器中使用这些键时,我都会看到这样的符号出现:
[[D^[[C
Run Code Online (Sandbox Code Playgroud)
我在ZSH中使用Linux Mint 12,但是我在使用bash的Ubuntu中获得了相同的结果.另外,在ssh中也是如此.
我现在用Jane Street的async_core加package(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
它说:
使用系统线程的程序必须按如下方式链接:
Run Code Online (Sandbox Code Playgroud)ocamlc -thread other options unix.cma threads.cma other files
所以我改变了我的ocamlbuild命令,如下所示:
ocamlbuild -use-ocamlfind -cflag -thread -I src test/test_airport.native
但错误仍然相同.还有ocamlbuild生成的实际命令保持不变-thread.
我怎么处理这个?
如果我有以下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,具体取决于它是只读还是可变.
依赖类型系统似乎支持ML模块系统的一些用途.你从模块系统中获得了什么,你没有从依赖记录中获得?
模块〜记录
签名〜记录类型
functor~记录功能
具有抽象类型组件的模块〜具有类型字段的依赖记录
我对它作为模块系统的工作情况感兴趣,以及是否以及如何集成应用程序仿函数和mixin等功能.
我经常听说F#缺乏对OCaml行类型的支持,这使得语言比F#更强大.
这些是什么?它们是代数数据类型,例如总和类型(有区别的联合)还是产品类型(元组,记录)?是否可以在其他方言中写行类型,例如F#?
在Python中,map()适用于遵循序列协议的任何数据.无论我是用字符串还是列表甚至元组提供它,它都能做出正确的事情.
我不能在OCaml吃蛋糕吗?除了查看我正在使用的集合类型并查找相应的List.map或Array.map或Buffer.map或String.map之外,我真的别无选择吗?其中一些甚至不存在!我要求的是不寻常的吗?我肯定错过了什么.
ocaml ×10
.net ×1
algorithm ×1
arrow-keys ×1
f# ×1
haskell ×1
ide ×1
interpreter ×1
ledit ×1
map ×1
module ×1
ocamlbuild ×1
polymorphism ×1
reduce ×1
sml ×1
syntax ×1
typerex ×1
types ×1