标签: ml

以ML(SMLNJ)打开文件

我需要读取ML(SLMNJ)中的文件并将其保存在某些结构中.我需要阅读一些指向图形声明的数据:

[( 1 , 2 , 13 ),( 2 , 3 , 3 ),( 2 , 4 , 8 ),( 2 , 5 , 4 ),( 3 , 1 , 5 ),( 3 , 4 , 1 ),( 4 , 6 , 5 ),( 5 , 5 , 5 ),( 6 , 4 , 6 )]
Run Code Online (Sandbox Code Playgroud)

(第一个数字:节点的名称,第二个数字:连接节点的名称,此鬃毛的第三个数字权重(每个()显示一个鬃毛))

对于expamle,这是测试输入如何读取文件以及保存它的结构

ml sml smlnj readfile

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

标准 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
查看次数

类型不匹配时出错

我在SML上写这个函数.它应该列出可能的名字变体(我的名字是Victoria,所以V,Vic,Vicky等)并创建{altname1,middle,last},{alt2,middle,last}的记录.

所以这是我的代码:

fun similar_names (substits:, name) = 
    let 
    val {first=n1, second=n2, third=n3} = name
    fun name_constructor (altnames:string list, acc) =
        case altnames of 
        [] => acc
         |  a::aa  => {first=a, second=n2, third=n3}::acc
    in 
    name_constructor( get_substitutions2(substits, n1),name)

    end
Run Code Online (Sandbox Code Playgroud)

get_substitutions2只会给出一个名字的所有可能变体的列表(即:字符串列表),并且它可以工作.

我得到的错误是:

a02.sml:65.2-65.58 Error: operator and operand don't agree [tycon mismatch]
  operator domain: string list * {first:string, second:'Z, third:'Y} list
  operand:         string list * {first:string, second:'Z, third:'Y}
  in expression:
    name_constructor (get_substitutions2 (substits,n1),name)
Run Code Online (Sandbox Code Playgroud)

我不明白为什么它只在记录列表和记录之间进行.你能帮忙吗?

functional-programming ml sml pattern-matching

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

函数式编程语言中的相互递归函数

单个递归函数可以应用尾递归优化,以防止堆栈溢出,但是相互递归函数呢?

这个答案显示了如何在F#中定义相互递归函数:

let rec F() = 
    G()
and G() =
    F()
Run Code Online (Sandbox Code Playgroud)

是否以这种方式定义,以便生成的本机机器代码或字节码最终只包含一个函数,尾递归优化应用于F和G?这会阻止堆栈溢出吗?

对于相互递归函数,尾调用算法如何工作?

另一方面,Haskell不需要这样的语法.是因为Haskell的懒惰评估?或者@augustss建议,Haskell编译器是否也像上面那样做?

f# haskell functional-programming ml mutual-recursion

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

试图定义`$`类型

使用新泽西标准ML(v110.77),我试图$从Purely Functional Data Structures 定义数据类型:

datatype alpha susp = $ of alpha
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误:

- datatype alpha susp = $ of alpha;
stdIn:1.11-2.7 Error: syntax error: deleting  ID ID EQUALOP
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

ml sml

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

在OCaml中float-> float意味着什么?

我有这种类型,它定义了一个表达式.我知道这个*符号可以让我添加成对,但它的->用途是什么?

 # type expression = Value of float                   
                | Sum of (expr*expr)     
                | Subtraction of (expr*expr)     
                | Fc1 of ((float->float)*expr)   
Run Code Online (Sandbox Code Playgroud)

ocaml ml

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

大输入的堆栈溢出

所以这是我计划的一部分。当我为差值超过 250000 的数字调用 bound 时,它会导致堆栈溢出.. 我该如何解决这个问题?该程序适用于较小的输入。我很确定程序的其余部分都很好。有没有办法重写函数以便它们工作?我宁愿不使用 for while 循环。谢谢

let rec sqdigits a =
if a = 0 then 0
else ( a mod 10)*( a mod 10) + sqdigits (a/10);;

let rec bound c d =
if c>d then []
else (sqdigits (c))::(bound (c+1) d);;
Run Code Online (Sandbox Code Playgroud)

stack-overflow stack ocaml ml overflow

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

如何以let绑定的方式在SML中定义常量?

有没有一种方法可以通过let绑定方式在SML中定义常量。因此,基本上,我要问的是例如如何通过以下方式执行constant x = 5

let
   ....
in
   ...
end
Run Code Online (Sandbox Code Playgroud)

functional-programming ml sml let

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

这个ocaml语法是什么意思?

type 'k leaf = {a_bb : 'k -> string;}
Run Code Online (Sandbox Code Playgroud)

我无法理解ocaml中这行代码的含义.有人可以帮忙吗?

syntax ocaml ml

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