SML与教会数字

我有一个任务,需要使用数据类型在SML中实现教堂数字:数据类型'a church=C of('a-'a)*'a->'a 我必须编写函数create:int->“一个church和一个函数churchToint 到目前为止,我有以下代码: datatype 'a church = C of ('a -> 'a) * 'a -> 'a val ZERO = C(fn (f,x) => x) fun subCreate 0 (f,x) = x | subCreate n (f

Sml 列表求和

我是SML的新手,我正在尝试列表练习。目标是汇总列表中以前的数字并创建一个新列表。例如,输入列表[1,4,6,9]将返回[1,5,11,20] 到目前为止,这是我的解决方案,但我认为问题在于如何定义函数 fun rec sum:int list -> int list = if tl(list) = nil then hd(list) else hd :: sum((hd(tail) + hd(tl(list)))::tl(tl(list)))

Sml ML curry和匿名函数

有人能给我解释一下这三种装帧是怎么回事吗? 帕伦夫妇的意义是什么?g的含义是什么?为什么在匿名函数中作为参数必须是g?总的来说,这一切到底发生了什么。。。谢谢大家! val a = fn g => (fn x => fn y => x) (g 0) (g 7); val b = fn g => (fn x => fn y => x) (g 0) (g "happy"); val c = fn g => (fn x => fn y => x)

使用MLton和MosML退出流程(流程模块缺失)

我正在尝试编写可以在mlton或mosml上编译的代码 在我的mosml中,我可以在失败时退出,如下所示 Process.exit(Process.failure) 然而,当我尝试重用相同的代码并在mlton上编译时。它在其库集中找不到进程。请让我知道我在编写代码方面的选择,这些代码将在一个源代码文件中的任何一个平台上工作。过程结构是操作系统的子结构,因此以下内容应该可以工作: OS.Process.exit OS.Process.failure 请参阅。在mlton和mosml中都能完美工

SML中的函数只有一个参数是什么意思?

所以我读到SML中的每个函数都有一个参数和一个 后果但我看到了这样的例子: fun foo x y = x + y; fun goo x y z = 5; 这些例子让我觉得他们有不止一个论点。 签名: val foo = fn : int -> int -> int val goo = fn : 'a -> 'b -> 'c -> int 我能想到的唯一可能的解释是“句法上的糖分”,尽管我不确定。对此的解释是什么?虽然您的示例似乎包含多个参数,但实际上一次只包含

在SML中遍历列表

我想创建一个函数,该函数遍历一个列表,处理head,在K个递归之后停止,并在每个递归中使用head元素创建一个相同的列表。代码: fun trav (0, _, list) = list | trav(K, x::xs, list) = trav(K - 1, xs, list@[x]) 所以如果我调用trav(4[1,2,3,4,5,6],]) 我想 list =[1] ,K=3 =[1,2] ,K=2 =[1,

Sml 标准ML:尝试获取函数的正确签名

我正在尝试创建具有此签名的函数: 'a->'b->('a * 'b ->'b)->'b 我尝试过这样的功能: fun f x y z = z(x,y); 但它的签名不同,它是: 'a->'b->('a * 'b ->'c)->'c 我怎样才能使它符合要求的尺寸? 有什么建议吗?我认为最不“人造”的应该是: fun f x y g = g (x, g (x, y)) 它通过两次调用g确保g的返回类型与其第二个参数的类型匹配,其中一个调用的结果

如何强制SML中的类型(如强制转换)

我正在创建一个有理数结构(int*int),其中一个函数是: fun diff ((n, d), (n', d')) = let val (top, bot) = sum ((n, d), (~n', d')) in (top / gcd(top, bot), bot / gcd(top, bot))

Sml 如何迭代列表?

我正在尝试使用SML进行基本的列表操作 我想提取列表中的每个元素,并将字符串附加到该元素,然后将其添加回列表。 例如: 如何在SML中遍历列表中的每个元素?我可以使用^附加字符串,并使用@连接列表,但如何从列表中提取每个元素 我们还可以使用map或array之类的东西来存储这些列表值并将其传递给SML中的不同函数吗 我只能找到一些关于地图的模糊信息,而没有关于如何使用地图的明确信息。两种简单的方法: - fun addstring (x::xs) a = (a^x) :: addstring x

在SML中将运算符定义为数据类型时,它们是否作为运算符的函数?

在SML中将运算符定义为数据类型时,它们是否作为运算符的函数 像datatype egexp=egexp的egadd*egexp egadd是否作为操作员或功能?我的意思是,我应该把表达式a+b写成egadd(a)(b)还是(a)egadd(b) 谢谢你你都没写。它作用于一个“函数”(实际上是一个值构造函数),采用您指定的类型 也就是说,由于您指定egadd采用egexp*egexp,因此它采用两个egexp的元组,即:egadd(a,b),其中a和b是egexp类型的值 如果需要,可以使用in

Sml 十六进制字符串到整数的转换

我有一个十六进制字符串,如“0xff”,并希望将其转换为int,即255 但是Int.fromString“0xff”给出了答案0 我认为Int.scan会有帮助。但是我是SML的新手。你可以这样做 StringCvt.scanString (Int.scan StringCvt.HEX) "0xff" 或 StringCvt.scanString (Int.scan StringCvt.HEX) "ff"

Sml 正在尝试定义`$`类型

使用新泽西州的标准ML(v110.77),我试图从纯功能数据结构中定义$数据类型: 数据类型alpha susp=$of alpha 但我有一个错误: -数据类型alpha susp=$of alpha; stdIn:1.11-2.7错误:语法错误:删除ID EQUALOP 我做错了什么?在标准ML中,类型变量的前缀是一个引号: datatype'alpha susp=$of'alpha 在标准ML中,类型变量的前缀是一个引号: datatype'alpha susp=$of'alpha +

在sml中打印整型列表

是否存在直接打印int列表的函数?为了调试,我必须打印int列表。我知道我可以通过编写自己的函数来实现这一点,但我想知道还有其他方法可用吗?没有,除了在SML中打印字符串之外,没有内置的方法。您可以编写自己的实用程序,也可以将函数分解为更小的组件,这些组件可以在REPL中单独测试,然后您将获得返回值的自动漂亮打印 如果您想构建自己的实用程序,MLton wiki有一个页面,描述如何构建一个小型组合器库来打印大多数内置类型: 对于列表,它们达到了您可以编写的程度: val "[3, 1, 4]"

Sml 两个列表的强并

我定义了函数: fun concaten(x,y) = if (x = []) then y else hd(x) :: concaten(tl(x),y); 以及: fun existsin(x,L) = if (L=[]) then false else if (x = hd(L)) then true else existsin(x,tl(L)); 我现在试图定义一个类型为(((list*list)->li

将字符串列表中的每个元素作为string-sml输出到它自己的行上

我是SML的新手,至少可以说我觉得很沮丧 我使用了一个数据类型,我称之为entry datatype entry = File of string | Directory of string * contents withtype contents = entry list 帮助我创建一个文件目录的复合模式,如下所示 val files = Directory("d1", [ File "f1", Directory("d2", [ File

Sml 标准ML中的行注释

我在用SML/NJ方言学习ML。我想弄清楚的是,是否有行注释操作符。我找到了块注释操作符(*…*),但我确实错过了行注释 建议?还是我只是被块注释卡住了?你被块注释卡住了 另一方面,块注释可以嵌套:(*(**)仍然在这里注释*)它建议在一个哈希标记后面加一个空格。这让我很难过,但哦,好吧。嵌套注释很酷,谢谢。请注意,这取决于您的编译器/交互环境。根据规范,注释可能不包含子字符串“*)”,因此即使某些实现比较宽松,也应该避免使用它。@Nicholas Wilson:你说得对,我把OCaml()搞混

Sml 中缀、中缀、中缀之间的差异

我读了一本在示例程序中使用中缀、中缀和中缀的书。我想知道有什么不同。我猜infixr从右向左执行操作,反之亦然。是的,r/l表示关联性。如果不进行测试,我会假设infix具有正常的左关联性。infix将运算符定义为左关联,infixr将其定义为右关联infixl不存在。它取决于实现。SML'97标准与SML/NJ和Mlton标准略有不同。在关联性规则和表达式的括号方式(取决于优先级)方面,每个表达式的行为略有不同(标准比实现更严格)

SML中函子结构的扩展与多重归属

在标准ML中,是否有任何方法可以使函子输出的结构具有传入结构的所有功能以及任何新功能 以类似的方式,是否可以进行多重归属?在上述情况下,它将立即有用,因为您可以将函子的输出归因于原始结构的签名和另一个指定新功能的签名 我理解这样做的含义,以及为什么这可能是个坏主意。目前,我刚刚在functor输出中保留了传入结构的一个副本,但这意味着您有一长串“Foo.Bar.func”来访问基本功能 谢谢您可以使用open将结构的内容带入当前范围。如果在另一个结构(或函子)中使用,它将执行我认为您想要的操作

网站丰富的练习或解释SML?

我知道我需要通过谷歌搜索等,但他们没有提供我需要的东西。90%的网站给出了相同的例子,甚至有时给出了相同的解释,如果有人有来自大学或学校的链接,或者可能在他的dropbox中,我将非常感谢。不幸的是,学习标准ML的最佳资源似乎是各种纸质书籍,如Hansen&Rischel的、Larry C.Paulson的或Robert Harper的。最后一本是免费在线提供的,以及我从未遇到过的各种大学课程的资源材料 以下是一门使用标准ML的课程:不幸的是,学习标准ML的最佳资源似乎是各种纸质书籍,如Hans

Sml 用ML生成Fibonacci序列的无限列表

我必须生成一个包含斐波那契序列的无限列表。我是ML新手,所以我想检查一下这是否正确 -datatype 'a infist=NIL = | CONS of 'a * (unit -> 'a inflist); - fun fib a b = CONS (a , fn()=> fib b (a+b)); val fib=fn: int->int-int inflist 这就是所谓的生成函数吗? 当我给出a和b输入时,它会给我一个实际输出,即无限fib序列吗?

在SML中检查列表的元素

嗨,我对ML/SML比较陌生,我正在尝试编写一个函数,该函数以2个列表作为输入。一个列表包含4个随机字符串[“鸭子”、“鹅”、“天鹅”、“海鸥”],第二个列表包含另外4个字符串[“鸭子”、“天鹅”、“鹅”、“鸽子”] 我想做的是将第一个列表中的每个元素与另一个元素进行对比。如果字符串处于相同位置且相等,则输出“是”。如果元素不在同一位置但在列表中,则输出“maybe”,如果元素不在第二个列表中,则输出“no” 因此,给出上面的两个示例,它将输出[“是”、“可能”、“可能”、“否”] 这就是我到目

SML中高阶函数的签名

我一直在努力理解SML中的高阶函数。我知道如何编写简单的高阶函数,也了解签名。一个例子是: fun increment list = map (fn x=> x + 1) list; val it = fn: int list -> int list 但是,我无法理解以下高阶函数的签名: fun add x y = x + y; val add = fn: int -> int -> int 该函数可以写成: fun add (x,y) = x+y; val add

接收BST数据类型并按顺序返回列表的sml函数

我有一个BST函数,它可以在中插入数字,如下所示 val t=节点(节点(空,10,空),20,节点(空,30,空)):BST 如何编写一个函数,它接受val t并返回BST中的顺序列表,如[10,20,30] 非常感谢你 通常您会使用顺序树遍历算法。它从根节点开始,处理左子树,然后处理当前节点的数据,最后处理右子树 但是在这种特殊情况下,标准的从左到右顺序遍历是非常低效的,因为它将使用列表的追加操作,即O(n) 为了能够使用list的prepend操作(即常量时间O(c)),您最好先处理右子树

Sml 指签名中涉及函子结果的类型

如何在从函子结果派生类型的结构中使用的签名中引用类型。以下是使用多边形解释器的示例: > signature Res = sig type f end; signature Res = sig type f end > functor F (A: sig type t end) : Res = struct datatype f = None | Some end; functor F (A: sig type t end): Res > structure S = struc

Sml 之后在HOL中接受的例外情况

我试图通过打包用来证明目标的策略来创建一个名为“吸收规则”的定理!(p:bool)(q:bool)。(p==>q==>p==>p/\q。但是,我在ACCEPT_TAC上遇到了一个例外。当我一个接一个地执行每个战术时,一切都很顺利 val absorptionRule = TAC_PROOF( ([],``!(p:bool) (q:bool).(p ==> q) ==> p ==> p /\ q``), REPEAT STRIP_TAC THEN ACCEPT_T

SML中的类型推断

我目前正在学习SML,我有一个关于一些我没有名字的问题。现在让我们称之为“类型别名”。假设我有以下数据类型定义: datatype 'a stack = Stack of 'a list; 现在我想添加一个显式的“空堆栈”类型。我可以通过将其添加到数据类型来解决此问题: datatype 'a stack = emptystack | Stack of 'a list; 现在我可以匹配一个函数,比如“push”: 这里的问题是Stack([])和emptystack是不同的,但我希望它们是相

SML或多或少的大型系统:编译器和解释器互操作性

这是关于使用SML进行大规模编程的。首先是一个关于这个目的的总结,然后是一个小小的总结,最后是一个简单的问题 usepseudo‑子句 请注意,use函数是特殊的。虽然 没有精确定义,其预期目的是 获取文件的路径名并处理 输入SML源代码时文件的内容 由用户输入。它可以用作一个简单的构建 机制,特别是交互式会话。 大多数实现将提供更复杂的 为更大的源代码集合构建机制 文件夹。实现不需要提供 使用函数 后来 val use : string -> unit (* implementa

List.filter函数在SML/NJ中不工作

我正在构建一个简单的函数来从列表1中删除项 fun Strip(item, List1) = filter (fn x => x <> item) List1; 错误: Error: Unbound variable or constructor: Strip 备用输入: filter (fn x => x <> 5) [1,3,5,2,5]; 你知道为什么这样一个简单的函数不起作用吗?至于错误消息“unbound variable or constru

SML在列表中添加两对数字

我试图获取一个列表,例如[1,2,3,4],然后将列表中的每一对数据相加,得到一个新的列表[3,7]。我不断地犯错误,我不知道这意味着什么。任何帮助都将不胜感激 fun listsum x = if null x then 0 else hd x + hd(tl x) :: listsum(tl x) + listsum(tl(tl x)); stdIn:3.6-3.58错误:运算符和操作数不一致[重载] operator domain: 'Z * 'Z list operand:

Sml 按字典顺序对一系列整洁的列表进行排序

考虑以下嵌套列表: [["AXY"],["ABC","XYZ"],["EFG","ACF"]] 我想按每个内部列表的第一个元素按字典顺序对列表进行排序。输出应为: [["ABC","XYZ"],["AXY"],["EFG","ACF"]] 如果任务是只对一个列表进行排序,我将使用以下线程()中的方法之一。但是如何对嵌套列表进行排序呢?假设有一个通用排序函数使用cmp函数(如图所示),则只需编写一个包含两个字符串列表的排序函数: fun cmpnest ((x::xs):string list

2个列表中的交替元素SML

在交替使用2个列表元素时,我的SML代码遇到了一些困难。我必须创建一个最终列表,其中包含两个相同大小的列表,并替换它们的元素。例如 alternate([1,3,5],[2,4,6])=[1,2,3,4,5,6] 我不确定我的代码哪里出了问题。任何帮助都将不胜感激。这是我目前拥有的代码 fun alternate2([],y) = [] | alternate2(a::x,y) = if length listx = length listy then if c

如何在SML中使用foldr解析列表

假设我有一个列表: type myList = (string * int) list; 我想用foldr找到这个列表中的一个特定元素,比如: fun findElement (element : string) (list : myList) : int result = if needed_element is equal current_list_element then return current_list_element else continue checking the r

Sml 用于添加自定义数据类型的ML函数

因此,我得到的是: datatype intnest = INT of int | LIST of intnest list; 我被告知要编写一个函数,将intnest中的所有整数相加。一个问题是我真的不明白什么是intnest。你能给我一张有效的支票吗 我需要一些东西来检查我写的方法,我尝试的任何东西都不会被接受 我尝试过以下方法: val in1 = [1,2,3,[1,2,3]]; val in2 = [1,2,3,[1]]; 等等。。。所以,如

Sml 在索引处插入到列表中

我试图用SML将一个值插入“寄存器”。如果列表(或寄存器)未在该索引处定义,我需要在该索引之前创建一个0的列表。我已尝试以下操作,但无法使其正常工作 fun storeInReg [] valIns idx = if idx = 0 then [valIns] else 0::storeInReg( [] valIns (idx-1)) | storeInReg head::tail valIns idx = if idx = 0 then va

如何从另一个函数捕获SML中的异常?

我相信我对在SML中捕获异常有一些基本的误解 我编写了以下代码: fun my_g acc p = let val r = my_g acc in case p of Wildcard => acc | Variable x => if List.exists (fn y => y = x) acc then raise NoAnswer else x::acc

SML-不使用List.nth从列表中获取特定元素

我正试图学习SML atm的基础知识,却偶然发现了一个我找不到答案的任务 它将编写一个函数,该函数接受一个int和一个list,返回给定int的索引上列表中的一个特定元素。正如您所看到的,它与list.nth()函数完全相同 现在我很好奇。这就是我取得的成就,但我就是想不出一种方法来手动定位特定的索引 fun nth(nil, _) = 0 | nth(x::xs, 0) = x; | nth(x::xs, y) = val list = [1, 2, 3]; nth

尝试创建函数时SML中出现错误

我目前正在尝试编写一个名为seacantMethod的函数,它接受一个ML函数(类型real)→ 并返回表示函数根值的实值。我收到上面提到的错误,不知道如何修复它 错误:语法错误:删除ELSE VAL IDA fun secantMethod(f, x0, x1, iterations) = if i < iterations then 0 else val x2 = x1 - f(x1) * (x1 - x0) / real(f(x1) - f(x0)) i + 1

Sml 数据类型问题中的标准ml函数

我必须创建一个关于peano数字的函数,定义为以下数据类型: datatype 'a peano = P of ('a -> 'a) * 'a -> 'a val zero = P(fn (f, x) => x) 我必须实现的函数查找peano参数的连续peano编号p(p)。这是我写的: fun suc (P(p)) = case P(p) of P(fn(f,x)=>x) => P(fn(f,x)=>f(x)); 问题是我得到了以下错误: stdIn:

在smlnj中使用非默认重载运算符

smlnj将使重载运算符,如op+在默认情况下使用int,现在我想让它以real*real->real返回一个函数,如何以内联方式执行 “内联方式”与绑定新val不同: fun add(x:real,y:real) = x + y; 如果我的内存是正确的,则有一些语法允许sml it只执行类似“cast”op+到real的操作,但我在任何地方都找不到它。如果运算符的默认实例不是值类型所需的实例,则可以在操作数上使用类型注释来强制执行所需的类型 比如说, val f = fn a => a

Sml CPN工具中的定时索引颜色集导致未处理的异常错误

我正在使用CPN工具对分布式系统进行建模。CPN工具使用CPN ML作为SML的扩展。项目主页为:cpntools.org 我从一个简单的模型开始,当我试图使一个特定的索引颜色集计时时,我得到一个“内部错误”。在我的Petri网模型中还有另一个索引颜色集,它是定时的并且工作正常。我不知道如何排除故障,因为我不理解错误消息。你能帮我解释一下错误信息,或者给我一些提示,说明我可能做错了什么吗 模型是: 模型的声明如下: 错误消息是: Internal error: Compile error w

从给定列表返回字符串,单词之间有空格-sml

我必须编写一个SML函数,返回一个由给定列表中空格分隔的单词组成的句子。我必须至少使用一个foldl/foldr/map函数 这是我写的: fun add_spaces nil = "" | add_spaces(x::xs) = foldr (fn (x,xs) => (add_spaces x)^" "^xs) x [xs]; add_spaces(["Testing","function","with","this","sentence"]); 但该函数带来了一个反向字符串(

在这种情况下如何停止递归函数(SML)

如果L是[1,2,3],那么我想要一个[[1,2,3],[2,3,1],[3,1,2]] 因为每次我将第一个num追加到末尾时,如果L=[],那么这里就不起作用了 一旦函数有三个列表,如何停止它?您可以在函数中设置一个参数x,以跟踪递归的深度 fun p(L) = [L] @ p( tl(L) @ [hd(L)] ); 如果您不喜欢这个额外的参数,那么您可能知道,您可以定义另一个函数,使其等于p函数,并将参数强制为0 p([1, 2, 3], 0) 在函数中可以有一个参数x来跟踪递归

Sml 匹配冗余错误

我正在为SML中的插入排序编写一些代码。给你 fun compare(x:real, y:real, F) = F(x, y); fun isEqual(x:real, y:real) = ((x <= y) andalso (x >= y)); fun rinsert(x: real, L: real list, F) = [x] |rinsert(x, (y::ys), F) = if isEqual(x, y) then rinsert (x, ys, F)

SMLNJ插入排序运算符和操作数不一致错误

我正在用SML做一个插入排序代码,在这里 fun compare(x:real, y:real, F) = F(x, y); fun isEqual(x:real, y:real) = ((x <= y) andalso (x >= y)); fun rinsert(x: real, [], F) = [x] |rinsert(x, (y::ys), F) = if isEqual(x, y) then rinsert (x, ys, F) else if

关键词";作为「;在SML/NJ

我最近看到人们在SML/NJ程序中使用as。我找到的最有用的参考资料是 虽然OCaml也属于ML编程语言家族,但它们是不同的。例如,在前面答案中给出的示例程序中 let rec compress = function | a :: (b :: _ as t) -> if a = b then compress t else a :: compress t | smaller -> smaller;; 我把它翻译成SML/NJ是(如果我做错了,请纠正我) 正如您所看到

向SML中的函数传递引用

我想在sml中传递对函数foo的引用,并更改其值。考虑下面的场景: val x = ref 5; foo 3 x; (* now x will be 3 *) 在sml中是否可能?我知道sml没有变量,所以我不确定它是否可能。我希望通过这种方式创建测试,例如: val test1 = (foo (seq 2) = 2); val test2 = (foo it = 2); 它将不起作用,因为它将包含test1的输出(其布尔值)。我想传递一个引用x,并每次更改它 val x = ref

SML从数据类型调用函数

我正在学习sml,我被困在一个练习中。他们给了我一个这样的数据类型 datatype Expr = X |Y | Avg of Expr * Expr | Mul of Expr * Expr 我需要编写一个名为compute的函数,这样我就可以在函数类型为 Expr -> int -> int -> int 所以我做了这个 val rec compute = fn X =

编写一个SML函数,该函数采用文件名并返回一个不带空格的字符列表

在一次考试中,我发现了以下练习: “编写一个函数,该函数采用文件名(即“text.txt”),并返回不带空格的字符列表” 例如: “text.txt”包含“ab e ad c” 函数必须返回->[#“a”、#“b”、#“e”、#“a”、#“d”、#“c”] 哪种方法是解决练习的最简单方法? 我曾尝试使用库“TextIO”和函数“input1”,但我被卡住了。我不知道如何递归地实现这个函数。有人能帮忙吗?fun chars文件名= fun chars filename = let va

Sml 有没有办法在if-else语句中放置两个动作作为then的结果?

我想在if~~then~~中生成两个结果。 比如说, fun count (x,[]) = 0 | count (x,y::ys) = val cnt = 0 if x mod y = 0 then **/ cnt+1 and count(x,y/2) /** else count (x-y,ys) 如果If语句为true,如***/***中所述,是否有方法使其完成两件事 我想在if~~then~~[…]中生成两个结果 您可以使用元组创建一个返回两个结果的函数,例如: (*计算二次多项式的两个

上一页   1   2   3   4   5    6  ... 下一页 最后一页 共 20 页