目前的F#编译器是用F#编写的,是开源的,可以在.Net和Mono上运行,允许它在许多平台上运行,包括Windows,Mac和Linux.F#的Code Quotations机制已用于在WebSharper,Pit和FunScript等项目中将F#编译为JavaScript .在JVM上运行F#代码似乎也有一些兴趣.
如果有人想构建一个在JVM上运行的F#编译器,那么更容易:
我正在尝试理解关于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太多,但它似乎是一个复杂的方式,因为我要保持同步的东西在每一个变化.
有没有办法避免这种冗余,或者我每次都被迫重新声明类型?
提前致谢
对于ML风格的编程语言,如何确定给定模式是否"良好",特别是它是否详尽且不重叠?
假设您有以下模式:
match lst with
x :: y :: [] -> ...
[] -> ...
Run Code Online (Sandbox Code Playgroud)
要么:
match lst with
x :: xs -> ...
x :: [] -> ...
[] -> ...
Run Code Online (Sandbox Code Playgroud)
一个好的类型检查器会警告第一个不是详尽的,第二个是重叠的.对于任意数据类型,类型检查器如何做出一般性的决策?
我已经掌握了一些语言(粗略的专业知识):Python,C,C++,PHP,Javascript,Haskell,Java,MIPS,x86汇编程序.但是,自从我学会了一个新的,已经差不多2年了,我开始痒了.我有几个标准:
我在想Lisp(CL?还有什么?)或OCaml.我已经有了一些使用Haskell的函数式语言的经验(是的,我知道Lisp/OCaml是多范式的).我不是专家 - 例如来自Real World Haskell的部分代码仍然可以扭曲我的大脑,但我理解基本概念和一些高级概念(仿函数,monad).
哪一个选择?我忽略了其他任何语言?另外,您能不能包括一些有用的链接到好书/教程等.
在Haskell中,明确声明函数的类型签名被认为是一种好习惯,即使它(通常)可以推断出来.看起来这在OCaml中甚至不可能,例如
val add : int -> int -> int ;;
Run Code Online (Sandbox Code Playgroud)
给了我一个错误.(虽然我可以制作type只提供签名的模块.)
当我ocaml或者在ghci办公室工作时,我经常会为了更好的单词,值绑定,函数,加载的模块等建立一个重要的"上下文".有没有办法保存所有这些并在以后重新加载它,所以我可以继续我离开的地方?或者更好的是,将整个批次转储为可以重新加载的文本文件,或者将其简单地修改为可以编译成可执行文件的代码(例如通过添加Main)?
我的程序(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]],然后将该对象添加到另一个矩阵只有当两个对象具有与其第二个参数相同的矩阵时才进行类型检查.那有意义吗?
我正在研究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...
utop正在工作!感谢此处的utop文档
创建一个myutop_main.ml文件:
let () = UTop_main.main ()
utop使用llvm绑定创建自定义:
ocamlfind ocamlmktop -o llvmutop -thread -linkpkg -package utop -package llvm myutop_main.ml -cc g++
我的输入数字是一个int.但输入数字必须在-2055到2055的范围内,我想通过使用正则表达式来检查.
那么无论如何要写一个正则表达式来检查一个数字是否在(-2055,2055)中?
if语句用于检查数字是否在范围内更容易.但是我正在写一个解释器,所以我应该使用正则表达式来检查输入数字
我正在为一种新的函数式编程语言实现一种类型的系统,我目前正在编写这两种函数来统一它.有两种情况考虑:
+---------+---------+-------------------------------------------------------+
| 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)
k1和k2变数然后他们被实例化给对方.k1一个变量时,它被实例化为k2iff …ocaml haskell functional-programming type-inference unification