标签: ocaml

F#vs OCaml:堆栈溢出

我最近在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)本身?

首先在30行OCaml中实现了我的解决方案,并尝试了它:

$ 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)

stack-overflow f# ocaml tail-recursion

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

向Haskell添加ML样式模块有哪些主要的理论困难?

众所周知,Haskell风格的类型类和ML风格的模块提供了不同的指定接口的机制.它们(可能)具有相同的功率,但实际上每种都有其自身的优点和缺点.

由于我在语言功能方面有点像包容性,我的问题是:在Haskell中添加ML样式模块有哪些主要的理论上的困难?我对以下几行的答案感兴趣:

  • 现有的类型系统功能与ML型模块的交互性很差?(不良交互的一个例子是GADT和功能依赖,即使fundeps在技术上等同于相关类型!)

  • 为了编译ML样式的模块,必须在编译器端放弃什么?

  • ML样式模块如何与类型推断交互?

相关阅读:

ocaml haskell type-systems ml sml

60
推荐指数
3
解决办法
2826
查看次数

构建和构建OCaml项目的首选方法是什么?

对于生态系统的新手来说,目前尚不清楚构建和管理中小型OCaml项目的规范首选方式.我理解ocamlc&c.的基础知识- 它们反映了传统的UNIX C编译器,看起来很简单.但是,高于单个文件的一次性编译水平,目前还不清楚如何最好地简单干净地管理编译.问题不是寻找潜在的工具,而是通过社区的经验验证一种或几种正确的(足够的)方法来构建和构建标准的OCaml项目.

我的模型用例是一个适度但非常重要的项目,纯OCaml或OCaml加上C依赖项.这样一个项目:

  1. 包含许多源文件
  2. 链接到许多标准库
  3. 链接到一个或多个第三方库
  4. 可选地包括C库和OCaml包装器作为子项目(尽管这也可以单独管理并作为第三方库包含,如(3)中所示)

几个替代工具脱颖而出:

  • 自定义Makefile似乎是大多数开源OCaml包中的通用标准,但看起来令人沮丧的冗长和复杂 - 甚至比适度的C/C++项目更令人沮丧.更糟糕的是,许多甚至看似简单的OCaml库层都将autoconf/automake置于顶层,以实现更高的复杂性.
  • ocamlbuild似乎提供了一种现代化,简化的机制,可以使用最少的配置自动化构建,但是对于新手来说没有很好的文档记录,在OCaml生态系统的介绍性材料中也没有示例,也没有被各种已发布的OCaml项目明显使用.我一直在寻找灵感.
  • OASIS似乎是其他构建系统顶层的约定和库代码层,以支持构建包管理器和库,如Cabal.

(我也看过OMake,它似乎是一个自封的" make++",它还包括一套常用语言的标准规则,包括OCaml和ocaml- makenéeOCamlMakefile,为GNU提供标准规则的模板make.)

这些都是管理OCaml构建的首选现代方式吗?

项目文件的结构如何最佳?

如何包含和管理第三方库依赖项?是首选在系统级别安装它们,还是有一种标准和直接的方式在本地管理项目?我更喜欢一种模式,其中项目尽可能保持独立.

ocaml makefile build ocamlbuild

57
推荐指数
4
解决办法
6297
查看次数

解释模式匹配与开关

我一直在尝试向几个人解释switch语句和模式匹配(F#)之间的区别,但我还没有真正解释它.大多数时候他们只是看着我说"为什么你不只是使用if..then..else".

你会如何向他们解释?

编辑!感谢大家的精彩答案,我真的希望能够标出多个正确的答案.

f# ocaml sml pattern-matching

56
推荐指数
6
解决办法
9845
查看次数

纯功能数据结构有什么好处?

有大量关于数据结构的文本和数据结构代码库.我知道纯粹的功能数据结构更容易推理.但是,我很难理解在实用代码中使用纯函数式数据结构(使用函数式编程语言与否)的命令对应的真实世界优势.有人可以提供一些真实世界的案例,其中纯功能数据结构具有优势,为什么?

这个例子就像我在programming_language中使用data_structure_name来做应用程序,因为它可以做某些事情.

谢谢.

PS:我的意思是纯功能数据结构与持久数据结构不同.持久性数据结构是一种不会改变的数据结构.另一方面,纯功能数据结构是纯粹运行的数据结构.

ocaml haskell functional-programming purely-functional data-structures

56
推荐指数
5
解决办法
9668
查看次数

什么是更高效的?Haskell或OCaml

我花了18个月的时间来掌握函数式编程,从学习OCaml开始,现在已经有几个星期的Haskell了.现在我想采取下一步并实现一些实际的应用程序:一个简单的实时地形编辑器.我写了很多实时地形渲染引擎,所以这是一个熟悉的主题.使用的递归算法和数据结构似乎非常适合功能实现.

由于这是一个实时应用程序,我自然而然地寻找我能得到的最佳性能.现在,与OCaml或F#相比,OCaml的一些(恕我直言,非常烦人)支持者反对Haskell的频率很慢.但根据计算机语言基准测试游戏 Haskell经常击败OCaml,如果只是相当小的分数 - 仍然存在问题,这个基准测试只需要非常具体的样本.

正确的做法当然是用两种语言实现程序并进行比较,但我根本不想做双重工作.

但也许其他人在OCaml和Haskell中做了类似的应用程序并提供了一些数据?

benchmarking ocaml haskell

55
推荐指数
5
解决办法
2万
查看次数

OCaml:在另一个内部匹配表达式?

我目前正在与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)

ocaml pattern-matching

49
推荐指数
2
解决办法
3万
查看次数

如何构建OCaml交叉编译器

在找到为目标机器生成拟合配置文件的方法之后,仍然必须构建交叉编译器本身.如果主机和目标系统差异太大,那么使用这里描述的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 cross-compiling

49
推荐指数
1
解决办法
2847
查看次数

Ocaml和Opam:未绑定模块Core

我正试图建立一个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 opam

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

在OCaml设计大型项目

在OCaml中编写大型软件项目的最佳实践是什么?

你如何构建你的项目?

应该和不应该使用OCaml的哪些功能来简化代码管理?例外?一流的模块?GADTs?对象类型?

建立系统?测试框架?宬?

我找到了针对haskell的很好的建议,我认为为OCaml提供类似的东西会很好.

ocaml functional-programming

48
推荐指数
3
解决办法
4451
查看次数