如果您唯一反对的Sequence
是这种Nil
情况,您可以定义
type rec stream<'a> = { x:'a, next:() => stream<'a> }
与您的定义不同的是,我们正在创建一个新的递归类型,而不是试图定义一个递归类型表达式。
编辑:
使用元组或记录之间的区别在于,元组是结构类型的,而记录是名义类型的。
这改变了平等和身份方面的一切。
特别是原始定义可以理解为
type stream0<'a> = ('a, () => 'b ) as 'b
然后,每当想要将一个类型stream0<'a>
与一个元组类型进行比较时,可能需要将该缩写扩展无限次。
例如,这个函数是类型良好的。
let f: stream0<int> => (int, ()=>(int,() => _)) = (x) => x
或者这个:
let app_once = ((x,next)) => next ()
这里的一个重要结果是可以stream0<'a>
在预期有限流的上下文中使用 a 。换句话说,在stream0<'a> 和stream0<'a> 的有限版本之间有许多潜在的相等性。
相反,stream<'a>
创建一个新的不同类型构造函数的记录定义stream
。因此,astream<'a>
只能等于stream<'a>
。换句话说,为stream<'a>
let app_once = {x;next} => next(())
无法使用该类型
type one_stream<'a> = { x:'a, next:() => ('a, ()) }
在实践中,递归类型stream0<'a>
及其许多类型等式比有用更麻烦,并且默认情况下禁用此类递归类型。