我在示例程序中读了一本使用infix,infixr和infixl的书.我想知道差异是什么.我猜测infixr从右到左执行操作,反之亦然.
大家好,我有这段代码:
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) 我从未在Windows机器上使用过SML(之前在unix机器上使用过emacs).
对于我的生活,我在sml环境中找不到当前目录.如果我尝试:使用"filename.sml"它引发异常..我找不到放置文件的位置..
btw文件是用notepad ++编写的,只是用.sml扩展名命名.
我正在用SML编写一个作业,我已经做了一些练习问题,我觉得我错过了一些东西 - 我觉得我使用了太多的case陈述.这就是我正在做的事情以及我遇到问题的问题陈述:
编写一个函数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)编写一个函数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)考虑以下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中表达它?)
我在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交互模式.
我怎样才能做到这一点?
问题很简单.
如何在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)
我希望,有人可以帮忙.提前致谢!
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样式)区域.
我是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,以及如何使用'之前'?
我正在努力深入理解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 …