2010-02-12 3 views
7

Je viens d'installer la dernière version de F #, et j'ai ouvert une vieille solution pour voir ce qu'elle me dirait.Avertissement d'espace de noms F # 2.0

Il est une solution multi-fichiers, où le premier fichier comprend des 'fonctions d'extension' du module de liste:

module List = 
    ///Given list of 'rows', returns list of 'columns' 
    let rec transpose lst = 
     match lst with 
     | (_::_)::_ -> List.map List.hd lst :: transpose (List.map List.tl lst) 
     | _   -> [] 

Le compilateur n'aime ça, et dit:

Fichiers dans les bibliothèques ou les applications multi-fichiers doit commencer par un espace de noms ou une déclaration de module, par exemple 'Espace de noms SomeNamespace.SubNamespace' ou 'Module SomeNamespace.SomeModule'

Mais si je fais ceci:

module Foo.List = 

Il dit:

Une abréviation du module doit être un nom simple, pas un chemin

Que manque-t-il ici? Et quelle est la solution pour ce cas «spécial» où j'étends un module qui vient d'ailleurs?

Répondre

6

Faire l'espace de noms explicite:

namespace Microsoft.FSharp.Collections 

module List = 
    ///Given list of 'rows', returns list of 'columns' 
    let rec transpose lst = 
     match lst with 
     | (_::_)::_ -> List.map List.head lst :: transpose (List.map List.tail lst) 
     | _   -> [] 

Notez que List.hd et List.tl ont été renommés List.head et List.tail.

+0

hd -> tête et tl -> queue? Ces gens ne se soucient-ils pas du code golf? :) – Benjol

+2

:) - Ajoutez-les de nouveau puisque vous ajoutez déjà des fonctions au module Liste ... –

+3

L'autre moitié de la réponse, qui est très confuse, est que si vous n'avez pas d'espace de nom, et juste un module, vous devez Ne mettez pas un = après la déclaration du module. Mais si vous avez un espace de noms, vous avez besoin d'un = – Benjol