在OCaml中编写大型软件项目的最佳实践是什么? 你如何构build你的项目? OCaml的哪些特性不应该被用来简化代码pipe理? 例外? 一stream的模块? GADTs? 对象types? build立系统? testing框架? 宬? 我发现了对Haskell的很好的build议 ,我认为对于OCaml有一些类似的东西是很好的。
我一直在试图解释开关语句和模式匹配(F#)之间的区别,但我没有真正能够解释它..大多数时候,他们只是看着我说“那么为什么你不要只是使用..如果..“。 你将如何解释给他们? 编辑! 感谢大家的伟大的答案,我真的希望我可以标记多个正确的答案。
在find一种方法来为目标机器生成适配configuration文件之后 ,交叉编译器本身仍然必须被构build。 如果主机和目标系统差异太大,那么使用这里描述的1 1/2构build的方法(以及更多细节在这里 )似乎不起作用。 以下是构build脚本的更改部分(可以使用$ svn cat svn://svn.psellos.com/trunk/ocamlxarm/3.1/xarm-build ) # Small steps config1 () { # Configure for building bytecode interpreter to run on Intel OS X. # But specify * architecture for assembly and partial link. echo 'xarm-build: —– configure phase 1 —–' ./configure \ -prefix "" \ -no-curses \ -no-tk \ -no-graph […]
这似乎是一些types的等价比较,但不是string。 # 3 != 3;; – : bool = false # 3 != 2;; – : bool = true 这是预期的。 # "odp" = "odp";; – : bool = true # "odp" != "odp";; – : bool = true # "odp" <> "odp";; – : bool = false 为什么"odp" != "odp"评估为true ? 它究竟在做什么? 它不应该产生一个types错误?
我花了18个月的时间来掌握函数式编程,从学习OCaml开始,几个星期之后,Haskell开始了。 现在我想进行下一步并实现一些实际的应用程序:一个简单的实时地形编辑器。 我写了大量的实时地形渲染引擎,所以这是一个熟悉的话题。 而使用的recursionalgorithm和数据结构似乎非常适合于function实现。 随着这是一个实时应用程序,我自然而然地寻找我可以得到的最佳性能。 现在一些(恕我直言,非常恼人的)OCaml的支持者相对于OCaml或者F#来说,相对于Haskell来说相当慢。 但根据计算机语言基准游戏, Haskell经常击败OCaml,即使只有相当小的分数 – 仍然存在问题,这个基准只采取非常具体的样本。 正确的做法当然是用两种语言来实现这个程序,然后比较一下,但是我根本不想做双重工作。 但也许其他人在OCaml和Haskell做了类似的应用程序,并给出一些数字?
数据结构上有大量文本,数据结构代码库也有。 我明白,纯粹的function数据结构更容易推理。 然而,我很难理解在实际代码中使用纯函数式数据结构(使用函数式编程语言还是不使用函数式编程语言)在命令式对象上的真实世界优势。 有人可以提供一些真正的世界情况下,纯function数据结构有优势,为什么? 像我在编程语言中使用data_structure_name来做应用程序,因为它可以做某些事情 。 谢谢。 PS:我的意思是纯数据结构和持久数据结构不一样。 持久的数据结构是一个不会改变的数据结构? 另一方面,纯function数据结构是纯粹操作的数据结构。
对于这个生态系统的新手来说,build立和pipe理build设中小型OCaml项目的正式的首选方法是不清楚的。 我理解了ocamlc的基础知识,它们反映了传统的UNIX C编译器,看起来很简单。 但是,在单个文件一次编译的水平之上,不清楚如何更好地pipe理编译的简单和干净。 这个问题并不是寻找潜在的工具,而是通过构build和build立标准的OCaml项目来看到一个或几个正确的(足够的)方法 – 经过社区的validation。 我的模型用例是一个纯粹的OCaml或OCaml以及一个C依赖项的一个适度但不重要的项目。 这样一个项目: 包含一些源文件 链接到一些标准库 链接到一个或多个第三方库 可以select包含一个C库和OCaml包装作为子项目(虽然这也可以单独pipe理,并作为第三方库包含,如(3)) 几个替代工具脱颖而出: 自定义Makefiles似乎是大多数开源OCaml软件包的通用标准,但看起来令人沮丧和复杂 – 甚至比适度的C / C ++项目更为复杂。 更糟糕的是,很多甚至看起来很简单的OCaml库在autoconf / automake层上面更复杂。 ocamlbuild似乎提供了一个现代的,简化的机制,用最less的configuration自动化构build,但是它并没有很好的logging给新手,也没有在OCaml生态系统的介绍性材料中用实例来表示,也没有被任何已发布的OCaml项目我浏览过灵感。 OASIS似乎是其他构build系统上的一个约定和库代码层,以支持构build一个包pipe理器和库,如Cabal。 (我也看到了OMake ,它似乎是一个自制的“ make++ ”,它也包括一套通用语言的标准规则,包括OCaml和ocaml- makenéeOCamlMakefile,为GNU make提供了一个标准规则模板。 ) 这些都是pipe理OCaml的首选,现代化的方式吗? 项目文件的结构如何? 如何包含和pipe理第三方库依赖项? 是在系统级别安装它们还是在本地pipe理项目的标准和直接方式? 我更喜欢一个模型,在这个模型中尽可能保持项目独立。
众所周知,Haskell风格的types类和ML风格的模块为指定接口提供了不同的机制。 他们(可能)的权力是相等的,但实际上每个人都有自己的利益和弊端。 因为在语言特性方面我是一个包容性的人,所以我的问题是:在Haskell中joinML风格的模块有什么主要的理论困难? 我感兴趣的答复如下: 什么样的现有types系统function与ML风格模块交互不良? (一个糟糕的交互的例子是GADT和函数依赖,尽pipefundeps在技术上等同于关联的types!) 为了编译ML风格的模块,编译器最后必须放弃哪些东西? ML风格模块如何与types推断进行交互? 相关阅读: 罗伯特·哈珀的post引发了这个问题 讨论Haskell Reddit
最近我发现了一个关于Python程序员的F#的演示,在看完之后,决定自己实现一个解决“ant难题”的解决scheme。 有一只可以在平面网格上走动的ant。 ant可以一次向左,向右,向上或向下移动一个空间。 也就是说,从细胞(x,y),ant可以进入细胞(x + 1,y),(x-1,y),(x,y + 1)和(x,y-1)。 ant无法进入x和y坐标的数字之和大于25的点。 例如,点(59,79)是不可访问的,因为5 + 9 + 7 + 9 = 30,它大于25.问题是:如果ant在(1000,1000)开始时访问多less个点,包括(1000,1000)本身? 我首先在30行OCaml中实现了我的解决scheme,并试用了它: $ ocamlopt -unsafe -rectypes -inline 1000 -o puzzle ant.ml $ time ./puzzle Points: 148848 real 0m0.143s user 0m0.127s sys 0m0.013s 整洁,我的结果和leonardo在D和C ++中的实现一样 。 与leonardo的C ++实现相比,OCaml版本的运行速度比C ++慢大约2倍。 这是可以的,因为莱昂纳多使用队列来消除recursion。 然后我把代码翻译成F# …这是我得到的: Thanassis@HOME /g/Tmp/ant.fsharp $ /g/Program\ Files/FSharp-2.0.0.0/bin/fsc.exe ant.fs Microsoft […]
我希望在新项目上使用Haskell或OCaml,因为R太慢了。 我需要能够使用支持vector机器,理想地分离出每个执行并行运行。 我想用一种function性的语言,我觉得就性能和优雅而言,这两者是最好的(我喜欢Clojure,但是在短期testing中速度并不快)。 我倾向于OCaml,因为似乎有更多的支持与其他语言的集成,所以它可能是一个更好的长期合适的(例如OCaml-R )。 有没有人知道这种分析的好教程,或在Haskell或OCaml的代码示例?