2009-07-23 8 views
1

Je suis très nouveau à F # et je suis en train de faire une struct pour le stockage des polygones, et il doit contenir une liste de coordonnées:listes dans les structures dans F #?

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

mais Visual Studio dit « Le type « Microsoft.FSharp .Collections.list < _> 'attend 1 type argument (s) mais est donné 0 "

Je ne pense pas que je n'ai pas l'intention d'initialiser la liste dans la structure - il suffit de le déclarer.

Répondre

4

Voir

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

pour la réponse.

(répété ici:

Vous devez spécifier le type de liste, par exemple la liste < float>

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

.)

5

En plus de anwer de Brian: Vous pouvez également faire la structure générique lorsque vous ne connaissez pas le type de vos coordonnées à l'avance (même si string Polygon n'aurait pas beaucoup de sens)

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

En général, vous pouvez déclarer un type d'enregistrement comme celui-ci (en supposant que vous avez un type Coord)

type Polygon = { Coords : Coord list } 

// Code ... 

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

En ce qui concerne le "laisser myPolygon = {Coords = [...]}" syntaxe: puis-je entrer alors quelque chose comme ceci: « laisser myPolygon = {Coords = [[1, 2. ], [3., 4.]]} " ou dois-je d'abord définir tous mes Coords? (Je suppose que ce dernier a échoué à faire le premier) – loldrup

+0

La structure est immuable, vous devrez spécifier toutes les coordonnées dans l'initialisation => 'myPolygon = {Coords = [(1., 2.); (3, 4)]} ' – Dario

0

Pour le cas où vous voulez générer le flotteur comme int et d'autres polygones de type, vous pouvez utiliser le code suivant:

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];} 
+0

L'effet de "laisser genPolygon en ligne (a: « une liste) = nouvelle Polygon <'a> (a) " est juste pour éviter d'avoir à utiliser le constructeur à partir du type Polygon directement? Je suis plus intéressé par la possibilité de créer un polygone sans avoir à déclarer explicitement tous ses coins en premier. C'est à dire. écrire quelque chose comme: laissez myPolygon = {Coords = [[1., 2.], [3., 4.]]} – loldrup

+0

Oui, je suppose, les gens préfèrent utiliser "genPoly [1; 2; 3]" sur "nouveau Polygon [1; 2; 3]". Il semble que vous vouliez utiliser des types ML classiques, pas des structures. Je ne sais pas comment mettre en forme les commentaires, alors veuillez voir la réponse suivante: – ssp

0
> 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 
+0

Et si je veux m'assurer que les polygones n'utilisent que des flottants, pourquoi ne puis-je pas écrire ceci: type HeightCurve = {coords: liste } ;; let myHeightCurve = {coords = [[1.; 2..]; [1.; 2.]]} ;; – loldrup

+0

Vous pouvez, bien sûr. Utilisez simplement "type HeightCurve = {coords: float list list}" pour votre cas. – ssp

Questions connexes