创建一个新数据类型('a,'b)myList,其末尾有不同的类型

时间:2013-06-26 17:46:18

标签: 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 ends with int*)

2 个答案:

答案 0 :(得分:2)

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

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

然后您可以通过编写类似myList的内容来创建MyList ("hi", [B true, B false, A "hello", B true], false)

答案 1 :(得分:0)

它不是很优雅,但你可以做这样的事情

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来构建列表(保留所需的类型不变量)。