user134055
user134055

Reputation:

lists in structs in F#?

I'm very new to F# and I'm trying to make a struct for storing polygons, and it has to contain a list of coordinates:

type Polygon =
    struct
        val Coords : list
        new(list_of_Coords) = { Coords = list_of_Coords }
    end

but Visual studio says "The type 'Microsoft.FSharp.Collections.list<_>' expects 1 type argument(s) but is given 0"

I think not as I don't intend to initialise the list in the struct - just declare it.

Upvotes: 1

Views: 894

Answers (4)

ssp
ssp

Reputation: 1722

> type 'a F = { coords: 'a list };;

type 'a F =
  {coords: 'a list;}

> let dd = {coords=[1.;2.]};;

val dd : float F

> let dd = {coords=[[1.;2.];[1.;2.]]};;

val dd : float list F

Upvotes: 0

Dario
Dario

Reputation: 49218

In addition to Brian's anwer: You can also make the structure generic when you don't know the type of your coordinates in advance (even if string Polygon wouldn't make much sense)

type 'a Polygon =
    struct
        val Coords : 'a list
        new(list_of_Coords) = { Coords = list_of_Coords }
    end

Generally, you can declare a record type like this (assume you have a Coord type)

type Polygon = { Coords : Coord list }

// Code ...

let myPolygon = { Coords = [ ... ] }

Upvotes: 5

ssp
ssp

Reputation: 1722

For case you want generate as float as int and other type polygons, you can use following code:

type Polygon<'a> =
    struct
        val Coords : list <'a>
        new(list_of_Coords) = { Coords = list_of_Coords }
    end

let inline genPolygon (a: 'a list) =
  new Polygon<'a> (a)

> genPolygon [1;2;3];;
val it : Polygon<int> = FSI_0002+Polygon`1[System.Int32] {Coords = [1; 2; 3];}
> genPolygon [1.0;2.0;3.0];;
val it : Polygon<float>
= FSI_0002+Polygon`1[System.Double] {Coords = [1.0; 2.0; 3.0];}

Upvotes: 0

Brian
Brian

Reputation: 118865

See

http://cs.hubfs.net/forums/thread/11377.aspx

for the answer.

(Repeated here:

You need to specify the type of list, e.g. list<float>.

type Polygon =
    struct
        val Coords : list<float>
        new(list_of_Coords) = { Coords = list_of_Coords }
    end

)

Upvotes: 4

Related Questions