Hi,
for some (unknown and unfortunate!) reason, the MatchCollection doesn't implement the generic version of the IEnumerable interface. It implements only IEnumerable, but not IEnumerable<T> (which corresponds to seq<'a> in F#). You can use the Seq.cast function to convert the "untyped" version to a standard (typed) sequence like this:
Note that you'll need the type annotation "m:Match", because it specifies the target type. Otherwise the F# compiler will not know what's the right type to use (and it wouldn't let you access the properties such as m.Value, m.Length etc.)
for some (unknown and unfortunate!) reason, the MatchCollection doesn't implement the generic version of the IEnumerable interface. It implements only IEnumerable, but not IEnumerable<T> (which corresponds to seq<'a> in F#). You can use the Seq.cast function to convert the "untyped" version to a standard (typed) sequence like this:
let r = new Regex(...)
r.Matches("abcd") |> Seq.cast |> Seq.iter (fun (m:Match) -> printfn "%A" m);;
Note that you'll need the type annotation "m:Match", because it specifies the target type. Otherwise the F# compiler will not know what's the right type to use (and it wouldn't let you access the properties such as m.Value, m.Length etc.)
Got it. I hadn't realized that distinction.
Is there something in this output ...
> (new Regex ".*").Matches("foo")
;;
val it : MatchCollection = seq [foo {Captures = seq [...]; etc
... that could have pointed me in the right direction? Or do I just need to get in the habit of noticing when collection-type things are generic in the doc?
Is there something in this output ...
> (new Regex ".*").Matches("foo")
;;
val it : MatchCollection = seq [foo {Captures = seq [...]; etc
... that could have pointed me in the right direction? Or do I just need to get in the habit of noticing when collection-type things are generic in the doc?
No, I don't think so. Sometimes it'll print out seq < type >, but I'm not sure of the rules on that. For example:
> new System.Collections.Generic.List< int >([1;2;]);;
val it : Collections.Generic.List< int > = seq [1; 2]
No indicator there that List is seq < int >.
> new System.Collections.Generic.List< int >([1;2;]);;
val it : Collections.Generic.List< int > = seq [1; 2]
No indicator there that List is seq < int >.
public class MatchCollection : ICollection, IEnumerable
For some reason, it doesn't implement a generic IEnumerable, so it's not an 'a seq.
Try Seq.cast.
>Seq.cast;;
val it : (Collections.IEnumerable -> seq<'a>) = <fun:clo@0>
For some reason, it doesn't implement a generic IEnumerable, so it's not an 'a seq.
Try Seq.cast.
>Seq.cast;;
val it : (Collections.IEnumerable -> seq<'a>) = <fun:clo@0>
For some reason, it doesn't implement a generic IEnumerable<fun:clo @0="">The reason most likely being the fact that generics in .NET were non-existent at the time of writing. All (many, at least) collections originating from .NET 1 have the same 'problem'.
So it's a breaking change to add 'T IEnumerable to the IEnumerable interfaces?
Topic tags
- f# × 3583
- compiler × 262
- functional × 199
- c# × 117
- classes × 96
- web × 94
- book × 83
- .net × 80
- websharper × 72
- async × 71
- server × 43
- parallel × 42
- parsing × 41
- testing × 41
- asynchronous × 29
- monad × 28
- ocaml × 26
- tutorial × 26
- haskell × 25
- workflows × 21
- html × 20
- introduction × 19
- linq × 19
- wpf × 19
- silverlight × 18
- collections × 14
- pipeline × 14
- fpish × 13
- templates × 12
- monads × 11
- opinion × 10
- plugin × 9
- reactive × 9
- scheme × 9
- solid × 9
- basics × 8
- concurrent × 8
- deployment × 8
- how-to × 8
- sitelets × 8
- complexity × 7
- python × 7
- javascript × 6
- lisp × 6
- real-world × 6
- workshop × 6
- xaml × 6
- conference × 5
- dsl × 5
- java × 5
- ml × 5
- scala × 5
- jquery × 4
- lift × 4
- metaprogramming × 4
- teaching × 4
- alt.net × 3
- aml × 3
- enhancement × 3
- formlets × 3
- reflection × 3
- compilation × 2
- computation expressions × 2
- corporate × 2
- cufp × 2
- enterprise × 2
- erlang × 2
- http × 2
- interactive × 2
- interface × 2
- iphone × 2
- iteratee × 2
- jobs × 2
- keynote × 2
- numeric × 2
- obfuscation × 2
- oop × 2
- packaging × 2
- pipelines × 2
- sockets × 2
- stm × 2
- tcp × 2
- type provider × 2
- visual studio × 2
- .net interop × 1
- abstract class × 1
- agents × 1
- agile × 1
- appcelerator × 1
- asp.net mvc 4 × 1
- asp.net web api × 1
- ast × 1
- b-tree × 1
- bistro × 1
- blog × 1
- bug × 1
- client × 1
- cloud × 1
- continuation-passing style × 1
- css × 1
- data × 1
- database × 1
- declarative × 1
- dhtmlx × 1
- documentation × 1
- dol × 1
- domain × 1
- eclipse × 1
- em algorithm × 1
- emacs × 1
- emotion × 1
- error × 1
- example × 1
- extension methods × 1
- fear × 1
- fp × 1
- functional style × 1
- gc × 1
- generic × 1
- geometry × 1
- getlastwin32error × 1
- hash × 1
- history × 1
- html5 × 1
- httpcontext × 1
- hubfs × 1
- installer × 1
- interpreter × 1
- io × 1
- ios × 1
- ipad × 1
- kendo × 1
- licensing × 1
- list × 1
- macro × 1
- macros × 1
- marshal × 1
- math × 1
- metro style × 1
- micro orm × 1
- minimum-requirements × 1
- multithreading × 1
- nancy × 1
- nested loops × 1
- object relation mapper × 1
- object-oriented × 1
- offline × 1
- option × 1
- orm × 1
- osx × 1
- pattern matching × 1
- performance × 1
- phonegap × 1
- programming × 1
- quant × 1
- range × 1
- raphael × 1
- real-time × 1
- restful × 1
- round table × 1
- runtime × 1
- rx × 1
- script × 1
- session-state × 1
- sitelet × 1
- sql × 1
- stickynotes × 1
- stress × 1
- structures × 1
- tdd × 1
- trie × 1
- type × 1
- type providers × 1
- upload × 1
- vector × 1
- visual f# × 1
- visual studio shell × 1
- windows-phone × 1
- winrt × 1
- xna × 1
![]() |
Copyright (c) 2011-2012 IntelliFactory. All rights reserved. Home | Products | Consulting | Trainings | Blogs | Jobs | Contact Us | Built with WebSharper |


> (new Regex ".*").Matches("foo") |> Seq.iter (fun s -> printfn "s is %A" s);;
(new Regex ".*").Matches("foo") |> Seq.iter (fun s -> printfn "s is %A" s);;
-----------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
stdin(6,36): error FS0001: The type 'MatchCollection' is not compatible with the type 'seq<'a>'.
>
Looking at the result without the Seq.iter, I'm still confused:
> (new Regex ".*").Matches("foo")
;;
val it : MatchCollection = seq [foo {Captures = seq [...];
Groups = seq [...];
Index = 0;
Length = 3;
Success = true;
Value = "foo";}; {Captures = seq [...];
Groups = seq [...];
Index = 3;
Length = 0;
Success = true;
Value = "";}]
Sure looks like it's a seq. What am I missing?