Functional programming 引用自身的类型-SML

Functional programming 引用自身的类型-SML,functional-programming,sml,smlnj,Functional Programming,Sml,Smlnj,我是SML和这种编程风格的新手,我遇到了一些问题。我有一个任务要在ML中完成,但是我在建模数据时遇到了一些问题。我在C中解决了同样的问题,但在SML/NJ中我遇到了这样的问题。这是我想要的 我在C中有一个结构,如下所示: struct myStr { int someData; myOtherStruct someOtherData; struct myStr * next; struct myStr * prev; } 基本问题是,我根据someOtherDa

我是SML和这种编程风格的新手,我遇到了一些问题。我有一个任务要在ML中完成,但是我在建模数据时遇到了一些问题。我在C中解决了同样的问题,但在SML/NJ中我遇到了这样的问题。这是我想要的

我在C中有一个结构,如下所示:

struct myStr {
    int someData;
    myOtherStruct someOtherData;
    struct myStr * next;
    struct myStr * prev;
}
基本问题是,我根据
someOtherData
对指向
struct myStr
(或
struct myStr
,这无关紧要)的指针数组进行排序,然后,我将一些值更新到下一个
struct myStr
,并将下一个
struct myStr
重新排序到数组中,以便对其进行排序,然后循环到最后

我用C实现了相当复杂的排序,因为排序需要O(nlogn)和reordering:O(1)才能找到下一个myStr,O(logn)才能将这个特定元素重新排序到数组中

我无法将其建模到SML中

首先,我开始使用列表进行此操作,但每次都需要更改一个值。所以我开始考虑引用和数组(我知道这不是最好的东西)

我在ML中使用类型考虑了以下内容:

type myStr = { 
    someData : int, 
    someOtherData : myOtherType,
    next : myStr ref, 
    prev :  myStr ref
}
但这在ML中不起作用,因此产生以下错误:

stdIn:1.56-1.61 Error: unbound type constructor: myStr                                      
stdIn:1.38-1.43 Error: unbound type constructor: myStr  
基本问题是我想快速访问下一个元素(不是数组中的下一个元素)(如C中)。上面使用该类型的想法在SML中不起作用

我应该怎么做才能使上述类型正常工作,或者有没有其他方法可以正确地建模我的数据,以便得到我想要的

谢谢。

显然,类型别名(使用
类型
关键字定义)在SML中不能递归。要定义递归类型,需要使用
datatype
关键字定义代数数据类型。这样,您的代码可以按如下方式编译:

datatype myStr = MyStr of
  { 
    someData : int, 
    someOtherData : myOtherType,
    next : myStr ref, 
    prev :  myStr ref
  }
尽管如此,这一定义仍然存在很大问题。具体而言,它不允许有限(即非循环列表)。此外,您将无法定义这种类型的任何非递归值(尽管如果您只打算表示循环列表,那么这些值自然需要是递归的)

我假设这段代码的C版本通过让最后一个节点的下一个指针(和第一个节点的上一个指针)为空来表示非循环列表。问题是,ML中的
ref
s不能为null,因此不能在ML中使用相同的系统。因此,如果需要非循环列表,则需要添加一个显式
空的
值,以代替
null

datatype myStr = MyStr of
  { 
    someData : int, 
    someOtherData : myOtherType,
    next : myStr ref, 
    prev :  myStr ref
  }
  | Empty

附言:你说这是一项作业,但你没有说作业要求你做什么。如果作业是针对SML的,并且它没有特别要求您使用
ref
s/变异,那么我假设您应该在不变异的情况下解决问题,因此您需要考虑另一种方法。

您能解释一下您说“不起作用”是什么意思吗?你收到错误信息了吗?如果是,是哪一个?在ml中的类型定义之后添加了上述错误。这里是stdIn:1.56-1.61错误:未绑定类型构造函数:myStr stdIn:1.38-1.43错误:未绑定类型构造函数:myStr。但我坚信,即使有一种方法可以定义这种类型,但在这种编程风格中,这并不是最好的方法。我的C代码实际上是一个循环列表。作业是这样的。给定一条有离散位置和有限跑步者的环形道路,我从文件中读取每个跑步者的位置和速度(两个跑步者不能有相同的起始位置)。所有跑步者都向同一个方向跑(左或右),如果一名跑步者从他前面抓住了他,那么他前面的跑步者将被取消资格。我们被要求按照被取消资格的顺序打印被取消资格的跑步者。妮特:与其添加
空的
,不如选择
下一个
上一个
选项参考。我也会尝试一下,谢谢你提供的信息。顺便问一下,我如何访问存储变量c1的“someData”:例如myStr?