Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Collections 对集合类型进行抽象_Collections_F#_Language Features - Fatal编程技术网

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.to
zipWith
:所有集合模块都支持
map2
函数。@wmeyer:谢谢。能够独立于contai编写算法ner实现对我来说是一个很有价值的功能。我被告知,在大多数实际情况下,缺乏这种能力不是问题,我认为我根本不了解如何构造F#代码。我想如果你主要编写以
seq
作为输入并返回
数组
作为输出的算法,你会在大多数情况下,只要很少按摩,身体状况就会很好……但我可能错了。@Brian:谢谢,我会试试,看看它在我的情况下是什么样子和表现。谢谢,Joh。这确实很详细。谢谢,Joh。这确实很详细。