标签: sml

C是否有类似Haskell/ML的编译器?

人们已经在Scheme中为iPhone 写过游戏.因为(某些)Scheme编译器可以编译为C,所以很容易与Objective-C混合并与XCode集成.

知道 Haskell和OCaml编译器的补丁,以启用ARM/iOS后端.但那些看似非官方的,实验的/不稳定的.

我更喜欢静态haskell/ML类型系统而不是Scheme的动态类型.是否有一个稳定的ML/SML/Haskell编译器生成C代码,以便它可以像Scheme/Gambit-C一样使用?

iphone scheme haskell sml gambit

18
推荐指数
2
解决办法
2296
查看次数

什么是SML用于?

SML在真实单词中的用途是什么?

它的实际用途是否类似于Prolog?

prolog sml dcg

17
推荐指数
3
解决办法
7003
查看次数

增加SML/NJ中的打印深度

我试图让SML/NJ在顶层打印出一个结果,而不是在任何地方放置#符号.

根据一些旧的文档(以及2001年该新闻组的帖子),应该可以使用 Compiler.Control.Print.printDepth

但是,在SML/NJ版本110.7上,这只是一个错误:

- Compiler.Control.Print.printDepth := 100;
stdIn:1.1-30.8 Error: unbound structure: Control in path Compiler.Control.Print.printDepth
Run Code Online (Sandbox Code Playgroud)

sml smlnj

17
推荐指数
1
解决办法
4862
查看次数

函数式语言如何表示内存中的代数数据类型?

如果你在Haskell中编写生物信息学算法,你可能会使用代数数据类型来表示核苷酸:

data Nucleotide = A | T | C | G
Run Code Online (Sandbox Code Playgroud)

你会在标准ML或OCaml中做同样的事情,我假设(我从来没有真正使用过).

类型的值Nucleotide可以清楚地包含在两位中.但是,这样做会导致访问时间比每个Nucleotide值使用一个字节要慢,因为您需要使用二元运算符选择两个感兴趣的位.

因此,在决定如何表示代数数据类型时,编译器必须在内存效率和计算效率之间进行固有的权衡.此外,由于值可以是可变大小的事实,因此代数数据类型在内存中的表示变得更加复杂:

data Maybe a = Just a | Nothing
Run Code Online (Sandbox Code Playgroud)

显然,Maybe a表单的值在Just a逻辑上大于表单的值Nothing.在这样一个极端的例子中:

data Hulk a b c d e = Big a b c d e | Little
Run Code Online (Sandbox Code Playgroud)

你肯定不希望存储Little值null指针或值中包含的五个值的零Big值.我假设你只是使用堆分配的可变大小的内存,在开头有一个构造函数ID(例如,0for Big1for Little).但是,如果要Hulk在堆栈上存储值(表示更快),则必须将空白内存与Little值一起存储,以使该类型的所有值Hulk都具有相同的大小.另一个权衡.

Simon Marlow在之前的StackOverflow问题中回答了关于GHC的一般问题.但是,我有三个相关的问题仍然没有答案:

  • 标准ML(SML/NJ和MLton)和OCaml使用相同的技术吗?
  • 如果是这样,这些语言(或他们的兄弟姐妹)的任何不太常见的编译器是否会尝试其他技术?
  • 在这些语言中是否有一种相当简单的方法(理想情况下是一个pragma或选项标志)来使用更高效的内存表示,比如两位表示Nucleotide …

memory haskell functional-programming sml algebraic-data-types

17
推荐指数
1
解决办法
633
查看次数

SML:使用abstype和使用签名来隐藏结构的实现有什么区别?

我过去在SML做过一些工作,但现在我开始涉及更有趣的部分.

使用该abstype...with...end构造,我可以制作东西,但隐藏其实现细节.我还可以创建我想要制作的东西的签名,并使用:>运算符来构建一个遵循该签名的结构,以保持隐藏实现细节.

签名/结构不仅仅是一种更通用的弃用版本吗?对于签名/结构我不能做的弃用,我该怎么办?为什么我要使用abstype?

在此先感谢您的帮助!

举个例子:

signature SET = sig
    type set
    val empty: set
    val insert: int * set -> set
    val member: int * set -> bool
end

structure Set :> SET = struct
    type set = int list
    val empty = []
    fun insert(x, s) = x::s
    fun member(x, []) = false
      | member(x, h::t) = (x = h) orelse member(x, t)
end
Run Code Online (Sandbox Code Playgroud)

似乎至少和...一样强大

abstype AbsSet = absset of int list with
    val empty …
Run Code Online (Sandbox Code Playgroud)

structure sml signature

16
推荐指数
1
解决办法
2383
查看次数

SML中的嵌套case语句

这更像是一个风格问题而不是其他任何问题.鉴于以下代码:

case e1 of                    (* datatype type_of_e1  = p1 | p2 *)
    p1 => case e11 of         (* datatype type_of_e11 = NONE | SOME int *)
              NONE => expr11
            | SOME v => expr12 v
  | p2 => case e21 of         (* datatype type_of_e21 = NONE | SOME string *)
              NONE => expr21
            | SOME v => expr22 v
Run Code Online (Sandbox Code Playgroud)

有没有办法解决types of rules don't agree因尝试将e11模式匹配到p2而导致的错误,而不是将p1的表达式括在括号中?在P2模式还有另外一个case语句,避免"只是切换模式"答案;-).

更新:更改代码以反映更具体的情况

coding-style sml

16
推荐指数
2
解决办法
5123
查看次数

SML`o`运算符仅对单参数函数有用吗?

o组合物操作者(例如val x = foo o bar,其中foobar是两个功能),仅在单参数的函数和/或功能可用与参数相等数量?如果没有,是什么,比如说,组成语法foo(x,y)bar(x).

ml sml smlnj

15
推荐指数
2
解决办法
4378
查看次数

静态地"扩展"记录数据类型而没有间接麻烦

我目前正在处理一个三级流程,我需要一些信息才能访问和更新.信息也是三级的,这样一个级别的过程可能需要在其级别和更高级别访问/更新信息.

type info_0 = { ... fields ... }
type info_1 = { ... fields ... }
type info_2 = { ... fields ... }
Run Code Online (Sandbox Code Playgroud)

fun0会用a做一些东西info_0,然后将它传递给fun1a info_1,然后返回结果info_0并继续,fun1用另一个调用另一个info_1.同样的情况发生在较低级别.


我目前的代表有

type info_0 = { ... fields ... }
type info_1 = { i0: info_0; ... fields ... }
type info_2 = { i1: info_1; ... fields ... }
Run Code Online (Sandbox Code Playgroud)

fun2,更新info_0变得非常混乱:

let fun2 (i2: info_2): info_2 =
  { …
Run Code Online (Sandbox Code Playgroud)

ocaml records functional-programming nested sml

14
推荐指数
2
解决办法
1064
查看次数

什么时候在SML中使用分号?

我知道分号在REPL中用作终结符.但我很困惑何时在源文件中使用它们.

例如,之后没有必要val x = 1.但如果我之后省略它use "foo.sml",编译器会抱怨它.

那么,使用分号的规则是什么?

ml sml smlnj

14
推荐指数
1
解决办法
2503
查看次数

SML:类型和数据类型之间的差异

我是SML的新手,我想确保我真正了解基础知识.SML中的类型和数据类型有什么区别,以及何时使用哪个?

types sml smlnj

14
推荐指数
1
解决办法
5480
查看次数