Sml 创建一个新的数据类型(';a,';b)myList,在其末尾使用不同的类型

Sml 创建一个新的数据类型(';a,';b)myList,在其末尾使用不同的类型,sml,Sml,如何创建新的数据类型('a,'b)myList,该数据类型仅以type1开头,而仅以type2结尾 例如: [4,5,6,8,9.3,4.2,5.1] (*starts with int ends with real*) [“hi”, “hello”, true, false] (*starts with string ends with bool*) [4,5,6,8,9.3,4.2,5] (*can't because starts with int and

如何创建新的数据类型
('a,'b)myList
,该数据类型仅以
type1
开头,而仅以
type2
结尾

例如:

[4,5,6,8,9.3,4.2,5.1]        (*starts with int ends with real*)
[“hi”, “hello”, true, false] (*starts with string ends with bool*)
[4,5,6,8,9.3,4.2,5]          (*can't because starts with int and ends with int*)

首先请注意,
[]
总是创建类型为
list
的值,因此定义自己的类型不会改变在
[]
中只能使用一种类型的事实。因此,如果这是你的目标,你将无法实现它

您可以简单地定义
myList
以包含一个
'a
类型的值(第一个元素)、一个
('a'b可选)列表
和一个
'b
类型的值(最后一个元素),其中,
'a'b alternative
是您定义的一种类型,它可以包含
'a
'b


然后您可以通过编写类似于myList(“hi”、[B true,B false,A“hello”,B true],false)的内容来创建
myList
ss,但您可以这样做

datatype ('a, 'b) union = A of 'a 
                        | B of 'b;
abstype ('a,'b) mylist = MyList of 'a * ('a, 'b) union list * 'b
with
    fun Create (a,b) = MyList(a, [], b);
    fun Hd (MyList(a,_,_)) = a;
    fun Cons a1 (MyList(a2, middle, b)) = MyList(a1, (A a2) :: middle, b);
    fun ConsMiddle AorB (MyList(a, middle, b)) = MyList(a, AorB :: middle, b);
end;
通过为开始提供
'a
,为结束提供
'b
,可以创建一个列表。
然后,您可以通过在开始处插入
'a
,或在开始后立即插入
'a
'b
来建立列表(保留所需的类型不变量)

可能我对示例还不太清楚唯一的条件是列表以type1开头,以type2结尾,这意味着我可以这样做[“hi”,true,false,“hello”,true,false]您的解决方案只允许我做两个分开的列表,一个是type1,另一个是type2,然后合并them@user2525235啊,,我假设一旦出现
'b
类型的元素,就不允许再出现
'a
类型的元素。但你是说唯一的要求是第一个元素是
'a
,最后一个元素是a
'b
,所有其他元素都可以是
'a
'b
,没有限制?然后我误解了。@user2525235我假设每个
myList
必须至少有两个参数,对吗?@user2525235我编辑了我的答案,希望能满足您的要求。这正是我的意思,第一个元素是“a”,最后一个元素是“b”,其他所有元素都可以是“a”或“b”,没有限制。我的列表可以构建这个Type1(4,Type1(5,Type1(6,Type2)(9.3,Type2(4.2,Nil‘‘)));但是不能构建这个Type1(4,Type2(5.3,Type1(6,Nil)));因此没有任何假设,它无法生成包含一个元素的列表,因为它不符合要求谢谢您的帮助您希望能够对该列表执行哪些操作?通常,通过向另一个列表的头部添加新元素来递归地构建列表。你不能用你建议的奇怪类型的列表来实现这一点,因为一个包含1个元素的列表会是什么样子?