如何创建仅以('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*)
答案 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
来构建列表(保留所需的类型不变量)。