如何解决构造列表以其他类型终止
我是否需要定制的总和类型,才能定义一个数据类型,该数据类型是类型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)
我不确定是否有合理的方法来概括该管道(因为您通常需要对额外的终止元素做一些特殊的事情),因此这可能很繁琐,但是添加所需的任何功能应该很容易
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。