1

如何创建('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*)
4

2 回答 2

2

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

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

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

于 2013-06-26T18:20:33.097 回答
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 或在开始后立即插入 a'a或 a来构建列表'b(保留所需的类型不变量)。

于 2013-07-05T14:28:58.643 回答