Collections 对集合类型进行抽象
除了使用Collections 对集合类型进行抽象,collections,f#,language-features,Collections,F#,Language Features,除了使用seq模块之外,是否有可能编写其支持的集合类型的通用函数 目标是,在添加新的集合函数时,不必使用复制和粘贴。seq类型,这有时是需要的,例如,如果您想要实现自己的集合压缩(这是通过调用GetEnumerator返回的) 这是一种相对简单的类型,只能用于从集合中读取数据。因此,您总是会得到一个类型为seq的值,并且当您需要一个专门的集合(例如,用于性能的数组)时,您通常需要一个稍微不同的实现。类型为seq类型,这有时是需要的,例如,如果您想要实现自己的集合压缩(这是通过调用GetEnum
seq
模块之外,是否有可能编写其支持的集合类型的通用函数
目标是,在添加新的集合函数时,不必使用复制和粘贴。seq类型,这有时是需要的,例如,如果您想要实现自己的集合压缩(这是通过调用GetEnumerator
返回的)
这是一种相对简单的类型,只能用于从集合中读取数据。因此,您总是会得到一个类型为seq
的值,并且当您需要一个专门的集合(例如,用于性能的数组)时,您通常需要一个稍微不同的实现。类型为seq
类型,这有时是需要的,例如,如果您想要实现自己的集合压缩(这是通过调用GetEnumerator
返回的)
这是一种相对简单的类型,只能用于从集合中读取数据。因此,当您需要专门的集合(例如,用于性能的数组)时,总是会得到类型为
seq
的值无论如何,您通常需要一个稍微不同的实现。使用集合的泛型编程可以像一般的泛型编程一样处理:使用泛型
let f (map_fun : ('T1 -> 'T2) -> 'T1s -> 'T2s) (iter_fun : ('T2 -> unit) -> 'T2s -> unit) (ts : 'T1s) (g : 'T1 -> 'T2) (h : 'T2 -> unit)=
ts
|> map_fun g
|> iter_fun h
type A =
static member F(ts, g, h) = f (Array.map) (Array.iter) ts g h
static member F(ts, g, h) = f (List.map) (List.iter) ts g h
有点难看和冗长,但这是可能的。我使用类和静态成员来利用重载。在代码中,您可以只使用A.F,并将调用正确的专门化
要获得更美观的解决方案,请参阅虽然此功能仅对核心库启用,但修改编译器以允许其进入代码中应该不会有问题。这是可能的,因为编译器的源代码是开放的。使用集合的泛型编程可以按照一般的泛型编程方式进行处理:Using泛型
let f (map_fun : ('T1 -> 'T2) -> 'T1s -> 'T2s) (iter_fun : ('T2 -> unit) -> 'T2s -> unit) (ts : 'T1s) (g : 'T1 -> 'T2) (h : 'T2 -> unit)=
ts
|> map_fun g
|> iter_fun h
type A =
static member F(ts, g, h) = f (Array.map) (Array.iter) ts g h
static member F(ts, g, h) = f (List.map) (List.iter) ts g h
有点难看和冗长,但这是可能的。我使用类和静态成员来利用重载。在代码中,您可以只使用A.F,并将调用正确的专门化
要获得更漂亮的解决方案,请参阅虽然此功能仅为核心库启用,但修改编译器以允许其进入代码应该不是问题。这是可能的,因为编译器的源代码是开放的。谢谢您的回答。因此,如果我想保留有关原始集合类型的信息(咬紧牙关),当以后想把代码“链接到一个手工滚动的ZIPOP操作之前,”我必须咬住子弹,复制和粘贴ZIPOW,以支持所有我想支持的集合类型?@亚力山大:是的,完全写不依赖于容器的算法(例如C++)就我所知,在F#中是不可能的。我想理论上可以围绕不同的集合类型实现面向对象的包装器……但这值得吗?-Wrt.to
zipWith
:所有集合模块都支持map2
函数。@wmeyer:谢谢。能够独立于contai编写算法ner实现对我来说是一个很有价值的功能。我被告知,在大多数实际情况下,缺乏这种能力不是问题,我认为我根本不了解如何构造F#代码。我想如果你主要编写以seq
作为输入并返回数组
作为输出的算法,你会在大多数情况下,只要很少按摩,身体状况就会很好……但我可能错了。@Brian:谢谢,我会试试,看看它在我的情况下是什么样子和表现。谢谢你的回答。所以如果我想保留关于我原始收藏类型的信息(咬紧牙关),当以后想把代码“链接到一个手工滚动的ZIPOP操作之前,”我必须咬住子弹,复制和粘贴ZIPOW,以支持所有我想支持的集合类型?@亚力山大:是的,完全写不依赖于容器的算法(例如C++)就我所知,在F#中是不可能的。我想理论上可以围绕不同的集合类型实现面向对象的包装器……但这值得吗?-Wrt.tozipWith
:所有集合模块都支持map2
函数。@wmeyer:谢谢。能够独立于contai编写算法ner实现对我来说是一个很有价值的功能。我被告知,在大多数实际情况下,缺乏这种能力不是问题,我认为我根本不了解如何构造F#代码。我想如果你主要编写以seq
作为输入并返回数组
作为输出的算法,你会在大多数情况下,只要很少按摩,身体状况就会很好……但我可能错了。@Brian:谢谢,我会试试,看看它在我的情况下是什么样子和表现。谢谢,Joh。这确实很详细。谢谢,Joh。这确实很详细。