嗨,我想选择一种FP语言(当你在一个不需要你学习的位置工作时总是很痛苦),经过一些研究后,我觉得Erlang和OCaml是我真的两个喜欢弄湿我的脚,原因如下:
1)我主要使用C++中的高可用性Web服务器后端系统.我听说Erlang在可扩展性和容错性方面是一个很好的解决方案.虽然我不认为我现在的公司会在Erlang有任何项目,但我觉得Erlang可能是我长期职业发展的好语言.
2)我有一个非常擅长OCaml的同事,我的意思是他真的很擅长(但他现在没有为他的日常工作工作.他维护着几个图书馆).所以我认为如果我学习OCaml,他可能是一个很好的资源.
我的兴趣主要是分布式系统(我目前的工作是一些中间件开发工作)和高性能计算(猜猜看,我有几年的研究生院研究,特别是金融应用程序中的PDE - 所以我总觉得我可能会在以后的某个时候回去做一些财务建模工作)
有什么建议?请不要建议"同时学习",因为我不聪明:-)
谢谢
我最近一直在做一些OCaml编程来学习语言并且更熟悉函数式编程.最近,我开始认为我希望能够扩展现有类型(或者内置或者我自己的类型),例如:
type bexp =
And of bexp * bexp
| Or of bexp * bexp
| Xor of bexp * bexp
| Not of bexp;;
Run Code Online (Sandbox Code Playgroud)
现在让我们说我想在这种类型中添加一个Nop变体,但仅用于新类型 - 有点像继承.嘿,这些应该是代数数据类型,对吧?那么为什么不是这样的:
type nbexp = bexp | Nop nbexp ;;
Run Code Online (Sandbox Code Playgroud)
...但这不是有效的OCaml,它给出了语法错误.基本上,我想要做的就是说我希望nbexp包含bexp包含的所有内容,并为此添加一个Nop.我想这是不可能的,因为,例如,如果您使用And构造函数,则无法确定它是bexp类型还是nbexp类型.(我认为构造函数Nop采用nbexp也可能存在问题.)
那么有没有办法在OCaml中做这样的事情?而且,这是否是Haskell中可行的事情(也许是类型类)?
我的问题是ocamlc和ocamlopt apear拒绝找到通过apt-get安装的第三方库.当我尝试将第三方模块合并到我自己的OCaml程序中时,我首先遇到了这个问题,并且很快将其写成个人未能理解OCaml编译.很快 - 然而 - 当我试图按照自己的指示编译其他人的项目时,我发现自己遇到了同样的问题.
这是最直接的例子.其他人都使用ocamlbuild,这会使事情变得模糊不清.
该计划:http://groups.google.com/group/fa.caml/msg/5aee553df34548e2
汇编:
$ocamlc -g -dtypes -pp camlp4oof -I +camlp4 dynlink.cma camlp4lib.cma -cc g++ llvm.cma llvm_bitwriter.cma minml.ml -o minml
File "minml.ml", line 43, characters 0-9:
Error:Unbound module Llvm
Run Code Online (Sandbox Code Playgroud)
即使我提供ocamlc与llvm文件的绝对路径,就像这样......
$ ocamlc -g -dtypes -pp camlp4oof -I +camlp4 dynlink.cma camlp4lib.cma -cc g++ /usr/lib/ocaml/llvm-2.7/llvm.cma /usr/lib/ocaml/llvm-2.7/llvm_bitwriter.cma minml.ml -o minml
Run Code Online (Sandbox Code Playgroud)
......无济于事
我究竟做错了什么?
我想向初学者宣传OCaml,我正在寻找英语的好教程; 不仅仅是你听说过,而是你实际上已经尝试并发现有用......
我希望使用OCaml访问Yahoo Finance API.从本质上讲,它只是一堆HTTP请求来获取雅虎财经的报价.
我应该使用哪个模块?
我希望有异步HTTP请求.
运行
open Graphics;;
Run Code Online (Sandbox Code Playgroud)
在ocaml中返回一个错误,说它是一个未绑定的模块.在终端(ocaml)中运行它会返回相同的内容.
这是否意味着我的图形模块以某种方式未安装ocaml包?如果是这样,我该如何安装模块?
在Fedora上.
Brodal等.在他们的ESA '06论文中证明了存在一个纯函数结构,具有对数时间搜索,更新和插入以及恒定时间合并.(注意我不是在谈论Brodal堆,它是一种不同的数据结构,广泛用于实现纯粹的功能优先级队列.)这似乎是一个非常有利可图的结果,应该导致高效的纯功能集和映射,但我没有看到他们在任何地方使用过:
containers使用亚当斯树;如果Brodal树真的有这么好的结果,为什么它们没有被改编成主流的函数式编程语言标准库?事实上,我根本没有看到一个Brodal树的实现!
具体来说,这是因为:
我在Emacs下编写OCaml,我makefile在工作文件夹中有一个,以及包含.ml文件的几个子文件夹.如果我在缓冲区上启动M-x compile并make正常工作makefile,但在.ml文件缓冲区上不起作用,则会给出错误:
-*- mode: compilation; default-directory: "..." -*-
Compilation started at Fri Jan 27 18:51:35
make -k
make: *** No targets specified and no makefile found. Stop.
Compilation exited abnormally with code 2 at Fri Jan 27 18:51:35
Run Code Online (Sandbox Code Playgroud)
这是可以理解的,因为default-directory是不包含的子文件夹makefile.有谁知道如何将makefilealways 的文件夹设置为编译的默认目录?
我需要一个带有int类型键的OCaml映射,所以我使用Map.Make创建一个.然而,似乎标准模块 "仅"提供需要转换的Big_int,Int32,Int64和Nativeint等模块.所以我必须做的事情如下:
module IntMap = Map.Make(Int32)
let a_map = IntMap.add (Int32.of_int 0) "zero" IntMap.empty ;;
Run Code Online (Sandbox Code Playgroud)
...我宁愿避免或定义我自己的愚蠢的Int模块确实处理简单的int文字或值而不需要转换函数:
module Int = struct
type t = int
let compare x y = if x < y then -1 else if x > y then 1 else 0 end ;;
module IntMap = Map.Make(Int)
let a_map = IntMap.add 0 "zero" IntMap.empty ;;
Run Code Online (Sandbox Code Playgroud)
我错过了一些明显的东西吗?
我已经看到一些线程涉及OCaml中的GUI编程,但我不认为它们在需要GUI界面时会明确地导致明确的解决方案.
我的问题,更具体地说,如下:在为OCaml软件编程GUI时,最有效(也很容易上手)的方法是什么?有没有人接触到OCaml本身的简单有效的GUI模块,或者找到了一个有效的语言或免费软件包,可以在其中完成这个并与OCaml进行良好的通信/播放?
我在OCaml中编写了一个解释器,所以我的词法分析器,解析器,核心解释器函数等都是OCaml模块.目前,我有一个命令行解决方案("main.ml"),它允许用户通过在命令行中键入表达式并接收显示已解析和缩减表达式等的打印终端输出来与解释器交互.但是,命令行解决方案仅用于测试目的.我希望用户通过GUI进行交互,它可以很简单(很久以前就会想到Java框架),但需要以某种方式与我编码的OCaml模块进行交互.到目前为止我在OCaml中找到了一个库:http: //caml.inria.fr/pub/docs/manual-ocaml-4.00/manual042.html.有谁知道这是否有效和有用?(我想我已经对这个图书馆发表了负面评论)
如果我选择用更优的语言编写GUI,那么软件交互是:用适当的语言编写GUI(可能是C++,Python等),然后将OCaml编写的解释器编译成可执行文件,然后以某种方式连接GUI可执行文件?我对一些松散连接或奇怪的解决方案感兴趣,通过管道(我一直在考虑这些的进程间通信,例如操作系统设计中涉及的内容)或套接字(我倾向于将这些用于网络编程),I想象如果不是OCaml本身,必须有某种方法将我的OCaml编码的解释器"容纳"在另一种语言的GUI代码中.有什么想法,指导或建议吗?
编辑:如果我能获得类似Linux的操作系统(即Linux RedHat)的GUI,我会很高兴.如果我可以让GUI在Windows上工作那将是很棒的,但至少我的目标是Linux.
编辑2:刚发现这个,有没有人对"OCaml-Java"有什么看法? http://ocamljava.x9c.fr/ 这听起来很有意思,因为它具有"...运行使用ocamlc编译的Objective Caml源的能力;其次,能够将Objective Caml源编译成可执行的jar文件".我担心的是,从来没有让我觉得Java是获得快速但有用的GUI的最佳方式......
当前的解决方案:在检查了@Jeffrey Scofield在下面提到的解决方案帖子中的各种选项之后,我选择了目前更深入的LablGtk(这将允许我留在OCaml中).对于那些关注这篇文章的人来说,下一个有希望的选择是研究外语与C的接口,因为C和OCaml已经开始有关系了.似乎有一些方法可以在C语言中调用OC代码和OCaml中的C代码(尽管这可能非常困难,因为您实际上最终会使用一些复杂的包装函数包装OCaml函数调用,这些函数将更加特定于您调用的函数类型在OCaml中 - >即你必须处理每个OCaml函数的"映射"及其在C)中的参数.请查看:http: //www.mega-nerd.com/erikd/Blog/CodeHacking/Ocaml/calling_ocaml.html,了解更多信息.OCaml-Java最初看起来像一个好主意,因为我对Java GUI编程感到满意,但两种语言之间的交互并不像C和OCaml那样直接,而且,这方面的文档似乎很小(并使用OCaml) -Java不是你刚接到的东西,而是获得Java GUI的东西......).OCaml-JavaScript看起来很有趣,但请记住,如果您选择此路径,除了一些JavaScript之外,您很可能不得不花时间在良好的HTML 5编码设置上.或者,SO中有几个帖子讨论管道和套接字,它们是创建GUI后端系统的有效方法.但是,如果您不介意您的程序系统/产品将"松散耦合",这是一个好主意.一旦我弄清楚LablGtk并确保它为我的OCaml后端代码产生可接受的GUI前端,我将更新此解决方案.