标签: sml

infix,infixr,infixl之间的区别

我在示例程序中读了一本使用infix,infixr和infixl的书.我想知道差异是什么.我猜测infixr从右到左执行操作,反之亦然.

sml

7
推荐指数
1
解决办法
2289
查看次数

新泽西州ML的嵌套本地声明

大家好,我有这段代码:

local
 helper(f, i, j) = local
                    fun NTimesF(f, n:int) = 
                    if n = 1 then fn (x) => f(x)
                    else fn (x) => f(NTimesF(f, n - 1)(x));
                   in
                    if(i <= j) then NTimesF(f, i) :: helper(f, (i+1), j)
                    else []
                   end
in  
 fun compList f n = helper(f, 1, n);
end;
Run Code Online (Sandbox Code Playgroud)

我需要编写接收一些函数f和整数n的程序并生成函数列表,如[f1,f2,... fn] < - fn是函数的组合n次但每次收到错误时:

- stdIn:1.1-2.9 Error: syntax error: deleting  LOCAL ID LPAREN
stdIn:2.10-2.14 Error: syntax error: deleting  COMMA ID COMMA
stdIn:2.16-2.25 Error: syntax error: deleting  RPAREN …
Run Code Online (Sandbox Code Playgroud)

sml smlnj

7
推荐指数
1
解决办法
8313
查看次数

在sml中使用操作(其中是当前目录smlnj windows)

我从未在Windows机器上使用过SML(之前在unix机器上使用过emacs).

对于我的生活,我在sml环境中找不到当前目录.如果我尝试:使用"filename.sml"它引发异常..我找不到放置文件的位置..

btw文件是用notepad ++编写的,只是用.sml扩展名命名.

sml smlnj

7
推荐指数
1
解决办法
4895
查看次数

案例陈述和模式匹配

我正在用SML编写一个作业,我已经做了一些练习问题,我觉得我错过了一些东西 - 我觉得我使用了太多的case陈述.这就是我正在做的事情以及我遇到问题的问题陈述:

  1. 编写一个函数all_except_option,它接受一个字符串和一个字符串列表.如果字符串不在列表中,则返回NONE,否则返回SOME lst,其中lst与参数列表类似,但字符串不在其中.

    fun all_except_option(str : string, lst : string list) =
      case lst of 
       [] => NONE
      | x::xs => case same_string(x, str) of
                   true => SOME xs
                 | false => case all_except_option(str, xs) of
                              NONE => NONE
                            | SOME y=> SOME (x::y)  
    
    Run Code Online (Sandbox Code Playgroud)
  2. 编写一个函数get_substitutions1,它接受一个字符串列表列表(字符串列表,替换列表)和一个字符串s并返回一个字符串列表.结果具有某些列表中的所有字符串,这些字符串也具有s,但s本身不应该在结果中.

    fun get_substitutions1(lst : string list list, s : string) = 
      case lst of
        [] => []
      | x::xs => case all_except_option(s, x) of
                     NONE => get_substitutions1(xs, s)
                    | SOME y => …
    Run Code Online (Sandbox Code Playgroud)

functional-programming case sml pattern-matching

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

将其论证应用于自身的函数?

考虑以下SML函数:

fn x => x x
Run Code Online (Sandbox Code Playgroud)

这会产生以下错误(新泽西标准ML v110.72):

stdIn:1.9-1.12 Error: operator is not a function [circularity]
  operator: 'Z
  in expression:
    x x
Run Code Online (Sandbox Code Playgroud)

我可以理解为什么这是不允许的 - 一方面,我不确定如何写下它的类型 - 但它并非完全没有意义; 例如,我可以将身份函数传递给它并将其恢复.

这个功能有名字吗?(有没有办法在SML中表达它?)

types functional-programming sml smlnj

7
推荐指数
1
解决办法
638
查看次数

运行SML文件但不能保持交互模式

我在Windows上使用新泽西SML.如果test.sml是SML文件,我可以通过在Windows命令提示符下运行它来执行它:

C:\> sml test.sml
Run Code Online (Sandbox Code Playgroud)

然后我得到通常的SML输出和一个新的SML命令提示符.

Standard ML of New Jersey v110.75 [built: Sat Sep 29 12:51:13 2012]
[opening hw1.sml]
val d2 = (1,1) : int * int
val d3 = (1,1) : int * int
val d4 = (2,1) : int * int
val d5 = (1,2) : int * int
val x7 = true : bool
-
Run Code Online (Sandbox Code Playgroud)

我想要的是退出到Windows命令提示符而不是留在SML交互模式.

我怎样才能做到这一点?

windows sml

7
推荐指数
2
解决办法
2602
查看次数

通过索引变量访问SML元组

问题很简单.

如何在SML中使用Index变量访问元组?

val index = 5;
val tuple1 = (1,2,3,4,5,6,7,8,9,10);

val correctValue = #index tuple1 ??
Run Code Online (Sandbox Code Playgroud)

我希望,有人可以帮忙.提前致谢!

tuples sml

7
推荐指数
2
解决办法
7816
查看次数

编码SML中的rank-2多态性等价物

runST是一个Haskell函数,它通过类型静态地约束资源的可用生命周期.为此,它使用rank-2多态性.标准ML的简单类型系统仅提供秩-1多态性.

标准ML是否仍然可以使用类型将资源的生命周期约束到类似的最终结果?

此页面此页面演示了一些重构代码的方法,只需要更简单的类型.如果我理解正确,核心是将表达式包装起来,以便它被上下文中可能的观察所取代,这些观察是有限的.这种技术一般吗?可以将它,或相关编码,具有一些可使用(显然在签名不相同)runST,以防止从被包裹的表达逸出值的类型被观察?如果是这样,怎么样?

我想象的场景是这样的:

magicRunSTLikeThing (fn resource =>
    (* do things with resource *)
    (* return a value that most definitely doesn't contain resource *)
)
Run Code Online (Sandbox Code Playgroud)

...其中magic...提供了用户提供的代码无法以任何方式共享的资源.显然,这样一个简单的界面具有单个库函数是不可能的,但也许有各种层次的包装和手工内联和提取......?

我已经看到了这一点,但如果我理解正确(...很可能不是),那实际上并不会阻止对资源的所有引用进行共享,只能确保对它的一个引用必须"关闭".

基本上我想在SML中实现安全类型的显式(非推断的MLKit样式)区域.

haskell ml sml hindley-milner higher-rank-types

7
推荐指数
1
解决办法
257
查看次数

SML中的SOME和NONE有哪些选择?

我是SML的新手(实际上是编程).

fun readlist (infile : string) =  

  let
  val 
      ins = TextIO.openIn infile 

      fun loop ins = 

      case TextIO.inputLine ins of 

      SOME line => line :: loop ins 

    | NONE      => [] 

  in 

     loop ins before TextIO.closeIn ins 

  end ;
Run Code Online (Sandbox Code Playgroud)

这是我在这里遇到的一个程序.我如何使用SOME和NONE,以及如何使用'之前'?

sml smlnj

7
推荐指数
2
解决办法
6787
查看次数

在设计模块时如何决定是在类型级别还是模块级别进行参数化?

我正在努力深入理解ML风格的模块:我认为这个概念很重要,我喜欢他们鼓励的那种思维方式.我刚刚发现参数类型和参数模块之间可能出现的张力.我正在寻找工具来思考这个问题,这将有助于我在构建程序时做出明智的设计决策.

拳头我将试着总体上描述我的问题.然后我将从我正在研究的学习项目中提供一个具体的例子.最后,我将重新审视一般性问题,以便将其引入一定程度.

(对不起,我还不太了解这个问题更简洁.)

总的来说,我发现的紧张是:当我们为它们提供参数类型签名(适当时)时,函数是最灵活的,并且对最广泛的重用开放.但是,当我们在模块内部封闭函数的参数化时,模块是最灵活的,并且对最广泛的重用是开放的,而是在给定类型上参数化整个模块.

在将实现LIST签名的模块与实现签名的 模块进行比较时,可以找到这种差异的现成示例ORD_SET.模块List:LIST提供了许多有用的函数,可以在任何类型上进行参数化.一旦我们定义或加载了一个List模块,我们就可以轻松地应用它提供的任何功能来构造,操作或检查任何类型的列表.例如,如果我们使用字符串和整数,我们可以使用同一个模块来构造和操作两种类型的值:

val strList = List.@ (["a","b"], ["c","d"])
val intList = List.@ ([1,2,3,4], [5,6,7,8])
Run Code Online (Sandbox Code Playgroud)

另一方面,如果我们想要处理有序集合,那么事情是不同的:有序集合要求有序关系保持其所有元素,并且没有单个具体函数compare : 'a * 'a -> order 为每种类型产生该关系.因此,我们需要一个不同的模块来满足ORD_SET我们希望放入有序集合的每种类型的签名.因此,为了构造或操纵有序的字符串和整数集,我们必须为每种类型实现不同的模块[1]:

structure IntOrdSet = BinarySetFn ( type ord_key = int
                                    val compare = Int.compare )
structure StrOrdSet = BinarySetFn ( type ord_key = string
                                    val compare = String.compare )
Run Code Online (Sandbox Code Playgroud)

然后,当我们希望对给定类型进行操作时,我们必须使用适当模块中的拟合函数:

val strSet = StrOrdSet.fromList ["a","b","c"]
val intSet = IntOrdSet.fromList [1,2,3,4,5,6]
Run Code Online (Sandbox Code Playgroud)

这里有一个非常直接的权衡:LIST模块提供的范围超出你喜欢的任何类型的函数,但它们不能利用任何特定类型的值之间的任何关系; ORD_SET …

parameters ocaml types modularity sml

7
推荐指数
1
解决办法
187
查看次数