标签: sml

标准 ML 排列

我正在研究一个列表中所有值的排列函数。

这是我到目前为止所拥有的:

//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 sml smlnj

0
推荐指数
1
解决办法
6008
查看次数

这是更好的标准ML或OCaml

我将制作模式匹配程序,您认为最好使用标准ML或OCaml?

ocaml artificial-intelligence sml pattern-matching

0
推荐指数
1
解决办法
359
查看次数

如何在不返回值的情况下退出函数

假设我有一个函数在满足给定条件时返回某个值,并且在不满足条件时不返回任何值.

例如

fun foo(n)=如果n <100000则是n else(类似于exit函数.我们在其他编程语言中使用它.我们在这里有类似的东西吗?)

我最初想写()但是它说if或者两个条件不匹配.

变得更明确,我想编写一个函数,它接受一个数字,任何数字,如果它是有效整数,则组合成一个列表,如果它不是整数则忽略它.

sml smlnj

0
推荐指数
1
解决办法
2105
查看次数

let-in表达式中的错误代码

我有这个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)

sml

0
推荐指数
1
解决办法
218
查看次数

是标准sml基础库中的zip函数吗?

我正在尝试实现一个函数,该函数从两个int列表创建一个列表以形成对.但是当我尝试运行zip时,它告诉我这是一个未绑定的变量.是否还有其他功能在库中执行相同的工作或使用折叠程序进行zip的某些定义?

sml smlnj

0
推荐指数
1
解决办法
1121
查看次数

标准ML:不确定高阶函数的类型

我正在阅读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)

functional-programming sml

0
推荐指数
2
解决办法
60
查看次数

用户定义的基于元组的数据构造函数

我再次尝试理解 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)

haskell types tuples sml cons

0
推荐指数
1
解决办法
83
查看次数

Sml 元组长度

我感兴趣的是是否有可能的方法来获得 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

sml smlnj mosml

0
推荐指数
1
解决办法
67
查看次数

为什么我的while循环不会以这种函数式语言终止?

我正在尝试使用命令式和功能性概念构建标准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");,它就没有.为什么会这样?

arrays algorithm functional-programming sml smlnj

-1
推荐指数
1
解决办法
339
查看次数

为什么在重新定义变量时使变量不可变并创建新条目?

在 SML 中,如果我是对的,默认情况下变量是不可变的。所以当我们尝试重新定义一个变量时

val y  = 100;
val y = 0.6;
y
Run Code Online (Sandbox Code Playgroud)

环境将有两个条目y。新条目隐藏原始条目。是不是和我们将原始条目中的值从 100 修改为 0.6 的效果一样?

  • 如果原始条目是在函数调用之外创建的,而新条目是在函数调用中创建的,那么当函数调用返回时,我们可以访问原始条目。

  • 如果两个条目都是在同一个“范围”中创建的,就像上面的例子一样,原始条目是否不可访问?

实际上,它在 SML 中与在命令式语言(如 C)中是不是一样的?在 SML 中使变量不可变并在重新定义变量时创建新条目有什么意义?

谢谢。

sml immutability

-2
推荐指数
1
解决办法
125
查看次数

如何用SML解决旅行推销员?

有没有人在标准ML中有旅行商问题解决方案,请告诉我.

我已经尝试了很多,但没有成功.

algorithm sml traveling-salesman

-4
推荐指数
1
解决办法
827
查看次数