构造列表以其他类型终止

问题描述

我是否需要定制的总和类型,才能定义一个数据类型,该数据类型是类型A的列表,其中最后一个元素是类型B(因此必须重新实现在其上定义的所有漂亮函数)。 / p>

xargs

好的,所以显而易见的是:

type ListTerminatedWith<'a,'b> = 
    | Cons of 'a * ListTerminatedWith<'a,'b> 
    | Nil of 'b

但是,实际上,我只想在到达列表时将终止值附加到列表中(真的问题是关于Seq ,而不是List )。

一个奇怪的例子是将值的总和说成一个字符串。

所以(在完整的伪代码中...我不希望它会编译)

type ListTerminatedWith<'a,'b> = List<'a> * 'b

该值由一个函数创建,当函数要终止时,该函数将附加“ 6”,就像创建一个序列一样。

解决方法

我可能会将您的类型定义为空,或者是由列表和终止值组成的一对:

type TerminatedList<'a,'b> = 
  | Empty
  | NonEmpty of list<'a> * 'b

这会使无效状态无法表示,但是它也会在表示的某些部分重用标准列表。您仍然必须为新类型重新定义自己的标准函数,例如map,但是至少您经常可以为List重用内置函数。例如,要定义map,可以使用一些额外的包装来重用List.map

module TerminatedList = 
  let map f = function 
    | Empty -> Empty 
    | NonEmpty(a,b) -> NonEmpty(List.map f a,f b)

我不确定是否有合理的方法来概括该管道(因为您通常需要对额外的终止元素做一些特殊的事情),因此这可能很繁琐,但是添加所需的任何功能应该很容易