我正在研究一个列表中所有值的排列函数。
这是我到目前为止所拥有的:
//MY ROTATE FUNCTION
fun rotate e [] = [[e]]
| rotate e (x::xs)= (e::x::xs)::(List.map (fn l => x::l) (rotate e xs));
//MY CURRENT PERMUTATION FUNCTION
fun perm [] = []
| perm (x::xs) = List.concat(List.map (fn l => (rotate x xs)) xs) @ perm xs;
Run Code Online (Sandbox Code Playgroud)
输出:
- perm [1,2,3];
val it = [[1,2,3],[2,1,3],[2,3,1],[1,2,3],[2,1,3],[2,3,1],[2,3],[3,2]]
Run Code Online (Sandbox Code Playgroud)
输出应该类似于 [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]。正如你所看到的,我在这里遗漏了一些东西。我相信问题是我的 3 没有被传递给旋转,因为旋转 3 [1,2] 是我的代码中缺少的,并且由于某种原因在这里有两个 2 …
我将制作模式匹配程序,您认为最好使用标准ML或OCaml?
假设我有一个函数在满足给定条件时返回某个值,并且在不满足条件时不返回任何值.
例如
fun foo(n)=如果n <100000则是n else(类似于exit函数.我们在其他编程语言中使用它.我们在这里有类似的东西吗?)
我最初想写()但是它说if或者两个条件不匹配.
变得更明确,我想编写一个函数,它接受一个数字,任何数字,如果它是有效整数,则组合成一个列表,如果它不是整数则忽略它.
我有这个SML代码.我不知道为什么我不能编译这个:
fun score =
let
val sum = 3; (* error at this line : SYNTAX ERROR : inserting LPAREN *)
if sum div 2 > 0
then sum = 0
else sum = 1
(*some other code*)
in
sum (* I want to return sum after some steps of calculation *)
end
Run Code Online (Sandbox Code Playgroud) 我正在尝试实现一个函数,该函数从两个int列表创建一个列表以形成对.但是当我尝试运行zip时,它告诉我这是一个未绑定的变量.是否还有其他功能在库中执行相同的工作或使用折叠程序进行zip的某些定义?
我正在阅读Harper的书,标准ML简介,并且在第11.3节"返回函数"中有点困惑.
1)他定义了一个创建常数函数的函数.他写:
"给定一个值k,应用程序constantly k产生一个函数,k无论何时应用它都会产生.这是一个定义constantly:
val constantly = fn k => (fn a => k)
Run Code Online (Sandbox Code Playgroud)
函数经常有类型'a -> ('b -> 'a)."这对我来说很有意义:你提供一个'a'类型的值,它返回一个总是返回该值(类型为'a)的函数,无论输入是什么(类型'b,可能是或者可能与'a)类型不同.
但他说我们也可以将此功能定义为:
fun constantly k a = k
Run Code Online (Sandbox Code Playgroud)
这看起来像一个函数,它接受两个参数并返回第一个...但不是一个返回另一个函数的函数...
我错过了什么?
2)稍后,哈珀讨论了一个地图功能.我理解基本的地图功能.然后他讨论了一个map函数,它允许我们将传入的函数应用于许多列表(而不是使用相同的传入函数调用我们的原始映射函数多次).他写:
fun map' f nil = nil
| map' f (h::t) = (f h) :: (map' f t)
Run Code Online (Sandbox Code Playgroud)
"如此定义的函数映射具有类型('a -> 'b) -> 'a list -> 'b list.它采用类型'a - >'b的函数作为参数,并产生另一个类型的函数'a list -> 'b list作为结果."
我在这里很丢失,因为看起来map'只是将f应用于列表中的所有元素并返回结果列表.所以我原以为它会是这样的类型:
('a -> 'b) * 'a list …Run Code Online (Sandbox Code Playgroud) 我再次尝试理解 The Little MLer。TLMLer 有这个 SML 代码
datatype a pizza = Bottom | Topping of (a * (a pizza))
datatype fish = Anchovy | Lox | Tuna
Run Code Online (Sandbox Code Playgroud)
我已经翻译为
data PizzaSh a = CrustSh | ToppingSh a (PizzaSh a)
data FishPSh = AnchovyPSh | LoxPSh | TunaPSh
Run Code Online (Sandbox Code Playgroud)
然后可能是更接近 TLMLer 的替代方案
data PizzaSh2 a = CrustSh2 | ToppingSh2 (a, PizzaSh2 a)
Run Code Online (Sandbox Code Playgroud)
从每一个我创造一个比萨
fpizza1 = ToppingSh AnchovyPSh (ToppingSh TunaPSh (ToppingSh LoxPSh CrustSh))
fpizza2 = ToppingSh2 (AnchovyPSh, ToppingSh2 (LoxPSh, ToppingSh2 (TunaPSh, CrustSh2))) …Run Code Online (Sandbox Code Playgroud) 我感兴趣的是是否有可能的方法来获得 sml 中元组的长度?!查看示例
val tes = ((1,"test"),("test","some"))
Lenght(tes) = 2
Run Code Online (Sandbox Code Playgroud)
我想要一个问题解决有一个问题,它说要获取学生列表,其中包含每个学生信息的列表,但学生信息在两种类型中有所不同,有些就像
(1,"test","nick")
Run Code Online (Sandbox Code Playgroud)
有些就像
("name","nick")
Run Code Online (Sandbox Code Playgroud)
所以它想返回学生列表中每个列表的第一个元素,如下所示:
((1,"test","nick"),("test2","nick2"),(2,"test3","nick3"))
Return > (1,"test2",2)
Run Code Online (Sandbox Code Playgroud)
这里有更多信息 M Molbdnilo @molbdnilo
我正在尝试使用命令式和功能性概念构建标准ML程序,并将内容写入文件.但我的while循环似乎没有终止,而是连续打印相同的值.
fun writeImage image filename =
let val ap = TextIO.openOut filename
val (w,h) = size image
val row = ref 0
val stringToWrite = "";
in
while !row < h do
TextIO.output(ap,"A");
row := !row + 1;
TextIO.closeOut ap
end;
Run Code Online (Sandbox Code Playgroud)
如果我在while循环之后删除第一行,则循环终止.但如果我包括TextIO.output(ap,"A");,它就没有.为什么会这样?
在 SML 中,如果我是对的,默认情况下变量是不可变的。所以当我们尝试重新定义一个变量时
val y = 100;
val y = 0.6;
y
Run Code Online (Sandbox Code Playgroud)
环境将有两个条目y。新条目隐藏原始条目。是不是和我们将原始条目中的值从 100 修改为 0.6 的效果一样?
如果原始条目是在函数调用之外创建的,而新条目是在函数调用中创建的,那么当函数调用返回时,我们可以访问原始条目。
如果两个条目都是在同一个“范围”中创建的,就像上面的例子一样,原始条目是否不可访问?
实际上,它在 SML 中与在命令式语言(如 C)中是不是一样的?在 SML 中使变量不可变并在重新定义变量时创建新条目有什么意义?
谢谢。
有没有人在标准ML中有旅行商问题解决方案,请告诉我.
我已经尝试了很多,但没有成功.