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
.net 是否有安全的方法将集合转换为F#中的序列?_.net_F#_Functional Programming - Fatal编程技术网

.net 是否有安全的方法将集合转换为F#中的序列?

.net 是否有安全的方法将集合转换为F#中的序列?,.net,f#,functional-programming,.net,F#,Functional Programming,大家下午好 因此,我一直在研究将.NET集合转换为功能数据结构的方法。我能得到的最好的结果就是先把它投给一个seq,然后再投给我想要的任何东西 问题是,这似乎破坏了类型推断,而类型推断显然是不安全的 例如: let a = new System.DirectoryServices.DirectorySearcher("<query>") in let entries = a.FindAll () let entries_list = let (entries_seq :

大家下午好

因此,我一直在研究将.NET集合转换为功能数据结构的方法。我能得到的最好的结果就是先把它投给一个seq,然后再投给我想要的任何东西

问题是,这似乎破坏了类型推断,而类型推断显然是不安全的

例如:

let a = new System.DirectoryServices.DirectorySearcher("<query>") in
let entries = a.FindAll ()
let entries_list = 
     let (entries_seq : seq<obj>) = Seq.cast entries_list in
     Seq.toList entries_Seq
in
entries_list (* list of AD objects found from query, has type obj *)

试图将其推广到seq大多数.NET集合实现了
IEnumerable
(别名为
seq正如Daniel所说,您通常不需要使用
seq.cast
,因为大多数集合已经实现了generic
seqDoes do
let entries_-seq:seq…
工作-这应该会产生一个强类型序列,而不是这样;我得到了一个值限制错误,这与我在中看到的一致。)g之前。感谢您的快速响应!我得到了这么多,但如何将其推广到所有此类集合?似乎我不能不进行大量静态键入。Carlos您是否希望
Seq.cast
但不需要arg类型?嗯,在许多情况下,可以从序列的后续使用中推断出来。kvb给出了一个有趣的结果lution,但它也有一些限制。这实际上可能正是我想要的。非常感谢!@Daniel-从技术上讲,循环可枚举提取的方法是有效的,“可枚举”可能不是真正的
IEnumerable
和“枚举器”可能不是真正的
IEnumerator
-它们可以是任何类型,支持具有正确名称和签名的方法。我试图模仿这种行为,但在OP的示例中,这种灵活性是不必要的。@Daniel-但是,for循环行为与我的行为仍然略有不同。它的工作方式是使用
Cu如果它有一个非
obj
类型,则直接删除
属性,否则只查找一个项索引属性。我认为您可以做一些额外的技巧,让
推断
在这两种模式之间进行选择,但我试图坚持一个可理解的定义。然后
for
的行为不同比C#的
foreach
foreach
不使用
Item
AFAIK.@Daniel-事实上,这是F#方法的一个优点。至少还有一个区别-C#编译器更喜欢基于模式的方法,而F#编译器更喜欢通过
IEnumerable
(例如,当结构枚举数不在C#中时,它可能被装箱在F#中)。
entries_list :?> SearchResult
open System.DirectoryServices

use searcher = new DirectorySearcher("<query>")
let entries = searcher.FindAll() |> Seq.cast<SearchResult>
let entries_list = Seq.toList entries
let typedSearchResults (s:SearchResultCollection) =
    seq { for result in s -> result }
module Seq =
    let inline inferCast s = 
        // constrain ^t to have an Item indexed property (which we don't actually invoke)
        let _ = fun x -> (^t : (member Item : int -> ^v with get) (x, 0))
        let e = (^t : (member GetEnumerator : unit -> ^e) s)
        seq { while (^e : (member MoveNext : unit -> bool) e) do
                yield (^e : (member Current : obj) e) :?> ^v }