我最近在Python程序员面前发现了一个关于F#的演示文稿,看了之后,我决定自己实现"蚂蚁拼图"的解决方案.
有一只蚂蚁可以在平面网格上走动.蚂蚁可以一次向左,向右,向上或向下移动一个空间.也就是说,从单元格(x,y),蚂蚁可以进入单元格(x + 1,y),(x-1,y),(x,y + 1)和(x,y-1).蚂蚁无法访问x和y坐标的数字之和大于25的点.例如,点(59,79)是不可访问的,因为5 + 9 + 7 + 9 = 30,大于25.问题是:如果从(1000,1000)开始,蚂蚁可以访问多少个点,包括(1000,1000)本身?
$ ocamlopt -unsafe -rectypes -inline 1000 -o puzzle ant.ml
$ time ./puzzle
Points: 148848
real 0m0.143s
user 0m0.127s
sys 0m0.013s
Run Code Online (Sandbox Code Playgroud)
整洁,我的结果与leonardo在D和C++中的实现相同.与leonardo的C++实现相比,OCaml版本的运行速度比C++慢大约2倍.这是好的,因为leonardo使用队列来删除递归.
然后我将代码翻译成F# ......这就是我得到的:
Thanassis@HOME /g/Tmp/ant.fsharp
$ /g/Program\ Files/FSharp-2.0.0.0/bin/fsc.exe ant.fs
Microsoft (R) F# 2.0 Compiler build 2.0.0.0
Copyright (c) Microsoft Corporation. All Rights Reserved.
Thanassis@HOME /g/Tmp/ant.fsharp
$ ./ant.exe
Process is terminated due to StackOverflowException.
Quit …Run Code Online (Sandbox Code Playgroud) 众所周知,Haskell风格的类型类和ML风格的模块提供了不同的指定接口的机制.它们(可能)具有相同的功率,但实际上每种都有其自身的优点和缺点.
由于我在语言功能方面有点像包容性,我的问题是:在Haskell中添加ML样式模块有哪些主要的理论上的困难?我对以下几行的答案感兴趣:
现有的类型系统功能与ML型模块的交互性很差?(不良交互的一个例子是GADT和功能依赖,即使fundeps在技术上等同于相关类型!)
为了编译ML样式的模块,必须在编译器端放弃什么?
ML样式模块如何与类型推断交互?
相关阅读:
对于生态系统的新手来说,目前尚不清楚构建和管理中小型OCaml项目的规范首选方式.我理解ocamlc&c.的基础知识- 它们反映了传统的UNIX C编译器,看起来很简单.但是,高于单个文件的一次性编译水平,目前还不清楚如何最好地简单干净地管理编译.问题不是寻找潜在的工具,而是通过社区的经验验证一种或几种正确的(足够的)方法来构建和构建标准的OCaml项目.
我的模型用例是一个适度但非常重要的项目,纯OCaml或OCaml加上C依赖项.这样一个项目:
几个替代工具脱颖而出:
(我也看过OMake,它似乎是一个自封的" make++",它还包括一套常用语言的标准规则,包括OCaml和ocaml- makenéeOCamlMakefile,为GNU提供标准规则的模板make.)
这些都是管理OCaml构建的首选现代方式吗?
项目文件的结构如何最佳?
如何包含和管理第三方库依赖项?是首选在系统级别安装它们,还是有一种标准和直接的方式在本地管理项目?我更喜欢一种模式,其中项目尽可能保持独立.
我一直在尝试向几个人解释switch语句和模式匹配(F#)之间的区别,但我还没有真正解释它.大多数时候他们只是看着我说"为什么你不只是使用if..then..else".
你会如何向他们解释?
编辑!感谢大家的精彩答案,我真的希望能够标出多个正确的答案.
有大量关于数据结构的文本和数据结构代码库.我知道纯粹的功能数据结构更容易推理.但是,我很难理解在实用代码中使用纯函数式数据结构(使用函数式编程语言与否)的命令对应的真实世界优势.有人可以提供一些真实世界的案例,其中纯功能数据结构具有优势,为什么?
这个例子就像我在programming_language中使用data_structure_name来做应用程序,因为它可以做某些事情.
谢谢.
PS:我的意思是纯功能数据结构与持久数据结构不同.持久性数据结构是一种不会改变的数据结构.另一方面,纯功能数据结构是纯粹运行的数据结构.
ocaml haskell functional-programming purely-functional data-structures
我花了18个月的时间来掌握函数式编程,从学习OCaml开始,现在已经有几个星期的Haskell了.现在我想采取下一步并实现一些实际的应用程序:一个简单的实时地形编辑器.我写了很多实时地形渲染引擎,所以这是一个熟悉的主题.使用的递归算法和数据结构似乎非常适合功能实现.
由于这是一个实时应用程序,我自然而然地寻找我能得到的最佳性能.现在,与OCaml或F#相比,OCaml的一些(恕我直言,非常烦人)支持者反对Haskell的频率很慢.但根据计算机语言基准测试游戏 Haskell经常击败OCaml,如果只是相当小的分数 - 仍然存在问题,这个基准测试只需要非常具体的样本.
正确的做法当然是用两种语言实现程序并进行比较,但我根本不想做双重工作.
但也许其他人在OCaml和Haskell中做了类似的应用程序并提供了一些数据?
我目前正在与OCaml合作开展一个小项目; 一个简单的数学表达式简化器.我应该在表达式中找到某些模式,并简化它们,以便表达式中的括号数减少.到目前为止,我已经能够实现大多数规则,除了两个,为此我决定创建一个递归的,模式匹配的"过滤器"函数.我需要实现的两个规则是:
- 将形式a - (b + c)或类似形式的所有表达式转换为a - b - c
- 将形式a /(b*c)或类似的所有表达式转换为a/b/c
...我怀疑它会相当简单,一旦我设法实现了一个,我就可以轻松实现另一个.但是,我遇到了递归模式匹配函数的问题.我的类型表达式是这样的:
type expr =
| Var of string (* variable *)
| Sum of expr * expr (* sum *)
| Diff of expr * expr (* difference *)
| Prod of expr * expr (* product *)
| Quot of expr * expr (* quotient *)
;;
Run Code Online (Sandbox Code Playgroud)
我主要遇到麻烦的是在比赛表达中.例如,我正在尝试这样的事情:
let rec filter exp =
match exp with
| Var v -> Var v
| Sum(e1, …Run Code Online (Sandbox Code Playgroud) 在找到为目标机器生成拟合配置文件的方法之后,仍然必须构建交叉编译器本身.如果主机和目标系统差异太大,那么使用这里描述的1 1/2构建的方法(以及更多细节,这里)似乎不起作用.这是构建脚本的更改部分(可以使用获得$ 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 \
-as "" \
-aspp ""\
-partialld ""
# Post-modify config/Makefile to select the * back end for
# ocamlopt (to generate …Run Code Online (Sandbox Code Playgroud) 我正试图建立一个ocaml环境,并且我遵循了Real World Ocaml beta附录A中的说明.我设置了opam,并在命令中安装了ocaml版本
$ opam switch 4.01.0dev+trunk
Run Code Online (Sandbox Code Playgroud)
过得很好.然后我做了一个
$ eval `opam config env`
Run Code Online (Sandbox Code Playgroud)
引入变化.我正在运行正确的顶级,如
$ which ocaml
Run Code Online (Sandbox Code Playgroud)
输出
/home/bryan/.opam/4.01.0dev+trunk/bin/ocaml
Run Code Online (Sandbox Code Playgroud)
我使用命令从Jane street安装了Core包
$ opam install core
Run Code Online (Sandbox Code Playgroud)
ocamlfind和opam搜索都显示包已正确安装.但是,当我尝试从repl或文件中打开它时,我收到错误'unbound module Core'.例如
$ ocaml
# open Core;;
Error: Unbound module Core
Run Code Online (Sandbox Code Playgroud)
这里有什么我想念的吗?为什么ocaml找不到我安装的模块?提前致谢.
在OCaml中编写大型软件项目的最佳实践是什么?
你如何构建你的项目?
应该和不应该使用OCaml的哪些功能来简化代码管理?例外?一流的模块?GADTs?对象类型?
建立系统?测试框架?宬?
我找到了针对haskell的很好的建议,我认为为OCaml提供类似的东西会很好.
ocaml ×10
haskell ×3
f# ×2
sml ×2
benchmarking ×1
build ×1
makefile ×1
ml ×1
ocamlbuild ×1
opam ×1
type-systems ×1