标签: ocaml

构建在JVM上运行并生成Java字节码的F#编译器的最简单方法是什么?

目前的F#编译器是用F#编写的,是开源的,可以在.Net和Mono上运行,允许它在许多平台上运行,包括Windows,Mac和Linux.F#的Code Quotations机制已用于在WebSharper,PitFunScript等项目中将F#编译为JavaScript .在JVM上运行F#代码似乎也有一些兴趣.

我相信OCaml编译器的一个版本最初用于引导 F#编译器.

如果有人想构建一个在JVM上运行的F#编译器,那么更容易:

  1. 修改现有的F#编译器以发出Java字节码,然后用它编译F#编译器?
  2. 使用像Yeti这样的基于JVM的ML编译器来引导JVM上的最小F#编译器?
  3. fjord项目似乎正在尝试时,在Java中从头开始重写F#编译器?
  4. 别的什么?

f# ocaml jvm yeti funscript

33
推荐指数
4
解决办法
2763
查看次数

OCaml类型声明中的冗余(ml/mli)

我正在尝试理解关于ocaml模块及其编译的具体事项:

我是否被迫重新声明已在.mli特定.ml实现中声明的类型?

举个例子:

(* foo.mli *)
type foobar = Bool of bool | Float of float | Int of int

(* foo.ml *)
type baz = foobar option
Run Code Online (Sandbox Code Playgroud)

根据我对接口/实现的正常思考方式,这应该没问题,但它说

错误:未绑定的类型构造函数foobar

在尝试编译时

ocamlc -c foo.mli
ocamlc -c foo.ml
Run Code Online (Sandbox Code Playgroud)

当然,如果我申报错误消失foobar里面foo.ml太多,但它似乎是一个复杂的方式,因为我要保持同步的东西在每一个变化.

有没有办法避免这种冗余,或者我每次都被迫重新声明类型?

提前致谢

ocaml module interface declaration

32
推荐指数
3
解决办法
7791
查看次数

用于类型检查ML类模式匹配的算法?

对于ML风格的编程语言,如何确定给定模式是否"良好",特别是它是否详尽且不重叠?

假设您有以下模式:

match lst with
  x :: y :: [] -> ...
  [] -> ...
Run Code Online (Sandbox Code Playgroud)

要么:

match lst with
  x :: xs -> ...
  x :: [] -> ...
  [] -> ...
Run Code Online (Sandbox Code Playgroud)

一个好的类型检查器会警告第一个不是详尽的,第二个是重叠的.对于任意数据类型,类型检查器如何做出一般性的决策?

algorithm ocaml haskell typechecking

32
推荐指数
1
解决办法
2548
查看次数

学什么?Lisp或OCaml还是......?

我已经掌握了一些语言(粗略的专业知识):Python,C,C++,PHP,Javascript,Haskell,Java,MIPS,x86汇编程序.但是,自从我学会了一个新的,已经差不多2年了,我开始痒了.我有几个标准:

  1. 必须(重复:必须)有一个免费的Linux实现
  2. 应该与我已经知道的语言不同.换句话说,它应具有让我思考以新方式解决问题的功能.
  3. 应该有一些实际应用的潜力.它不需要是下一个Java,但这排除了Brainf*和莎士比亚:)我真的不关心它有多少招聘帖子,但真实世界的应用程序和库是一个加号.
  4. 应该至少有足够的免费学习材料来帮助我入门.

我在想Lisp(CL?还有什么?)或OCaml.我已经有了一些使用Haskell的函数式语言的经验(是的,我知道Lisp/OCaml是多范式的).我不是专家 - 例如来自Real World Haskell的部分代码仍然可以扭曲我的大脑,但我理解基本概念和一些高级概念(仿函数,monad).

哪一个选择?我忽略了其他任何语言?另外,您能不能包括一些有用的链接到好书/教程等.

lisp ocaml programming-languages

30
推荐指数
9
解决办法
1万
查看次数

OCaml显式类型签名

在Haskell中,明确声明函数的类型签名被认为是一种好习惯,即使它(通常)可以推断出来.看起来这在OCaml中甚至不可能,例如

val add : int -> int -> int ;;
Run Code Online (Sandbox Code Playgroud)

给了我一个错误.(虽然我可以制作type只提供签名的模块.)

  1. 我是否正确,这在OCaml中是不可能做到的?
  2. 如果是这样,为什么?OCaml的类型系统似乎与Haskell完全不同.

syntax ocaml types type-inference

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

保存我的跑步以供以后使用

当我ocaml或者在ghci办公室工作时,我经常会为了更好的单词,值绑定,函数,加载的模块等建立一个重要的"上下文".有没有办法保存所有这些并在以后重新加载它,所以我可以继续我离开的地方?或者更好的是,将整个批次转储为可以重新加载的文本文件,或者将其简单地修改为可以编译成可执行文件的代码(例如通过添加Main)?

ocaml haskell ghci read-eval-print-loop

29
推荐指数
6
解决办法
851
查看次数

良好的类型系统可以区分不同基础的矩阵吗?

我的程序(Hartree-Fock /迭代SCF)有两个矩阵F和F',它们实际上是用两个不同的基数表示的相同矩阵.我只是失去了三个小时的调试时间,因为我不小心使用F'代替F.在C++中,类型检查器没有捕获这种错误,因为两个变量都是Eigen::Matrix<double, 2, 2>对象.

我想知道,对于Haskell/ML /等.人们,无论你是否正在编写这个程序,你都会构建一个F和F'有不同类型的类型系统?那会是什么样的?我基本上试图了解如何将一些逻辑错误外包给类型检查器.

编辑:矩阵的基础就像单位.你可以说1L或多加仑,它们都意味着同样的事情.或者,为了给出一个矢量示例,可以在笛卡尔坐标中说(0,1)或在极坐标中说(1,pi/2).但即使含义相同,数值也不同.

编辑:也许单位是错误的比喻.我不是在寻找某种记录类型,我可以指定第一个字段是升和第二个加仑,而是说这个矩阵作为一个整体,用一些其他矩阵来定义(基础),其中基础可以是任何相同维度的矩阵.例如,构造函数看起来像是mkMatrix [[1, 2], [3, 4]] [[5, 6], [7, 8]],然后将该对象添加到另一个矩阵只有当两个对象具有与其第二个参数相同的矩阵时才进行类型检查.那有意义吗?

编辑:维基百科上的定义,工作示例

ocaml haskell types type-systems sml

29
推荐指数
5
解决办法
1954
查看次数

llvm OCaml绑定

我正在研究llvm OCaml绑定.

我通过opam(opam install llvm)安装了llvm包,当我在utop中使用llvm时,我收到以下错误:

#require "llvm";;
Error: The external function 'llvm_global_succ' is not available. 
Run Code Online (Sandbox Code Playgroud)

opam llvm版本是3.2.

我也尝试从官方网站(./configure --with-ocaml-libdir='ocamlc -where')构建llvm3.3 ,构建成功(所有llvm命令行工具都正常工作),但我在utop中遇到了同样的错误.

我在Mac OS 10.7.5上.


编辑:我解决了..

ocamlmktop -o llvmtop llvm.cma -cc g++

然后启动llvmtop,之后可以使用llvm绑定open Llvm.

我还没有找到相应的utop...


Edit2:现在utop正在工作!

感谢此处utop文档

  1. 创建一个myutop_main.ml文件:

    let () = UTop_main.main ()

  2. utop使用llvm绑定创建自定义:

    ocamlfind ocamlmktop -o llvmutop -thread -linkpkg -package utop -package llvm myutop_main.ml -cc g++

ocaml llvm opam

29
推荐指数
1
解决办法
1955
查看次数

使用正则表达式验证数值范围

我的输入数字是一个int.但输入数字必须在-2055到2055的范围内,我想通过使用正则表达式来检查.

那么无论如何要写一个正则表达式来检查一个数字是否在(-2055,2055)中?

if语句用于检查数字是否在范围内更容易.但是我正在写一个解释器,所以我应该使用正则表达式来检查输入数字

regex ocaml

29
推荐指数
6
解决办法
7万
查看次数

是否有可能在Haskell 98中获得无限类错误?

我正在为一种新的函数式编程语言实现一种类型的系统,我目前正在编写这两种函数来统一它.有两种情况考虑:

+---------+---------+-------------------------------------------------------+
|   k1    |   k2    |                        action                         |
+=========+=========+=======================================================+
|   var   |   var   |                  k1 := k2 ^ k2 := k1                  |
+---------+---------+-------------------------------------------------------+
|   var   | non var |             if (!occurs(k1, k2)) k1 := k2             |
+---------+---------+-------------------------------------------------------+
| non var |   var   |             if (!occurs(k2, k1)) k2 := k1             |
+---------+---------+-------------------------------------------------------+
| non var | non var | ensure same name and arity, and unify respective args |
+---------+---------+-------------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)
  1. 当两个k1k2变数然后他们被实例化给对方.
  2. 当只是k1一个变量时,它被实例化为k2iff …

ocaml haskell functional-programming type-inference unification

29
推荐指数
2
解决办法
819
查看次数