Précédent   Forum du club des développeurs et IT Pro > Autres langages > Langages fonctionnels > F#
F# Forum d'entraide sur la programmation en langage fonctionnel F#
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 04/09/2010, 21h38   #1
Thorna
Membre éprouvé
 
Inscription : décembre 2004
Messages : 362
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 362
Points : 418
Points : 418
Par défaut Découverte et affaire de modules

Bonjour à tous.
N'ayant jamais pratiqué le moindre langage fonctionnel qui soit et y voyant en général le Mal, j'ai tenté quand même le pas avec F#, ce qui me permettait de rester dans un environnement connu. Hé bien je dois dire que je tiens encore après plus d'une semaine d'immersion complète !
J'y vois deux raisons : tout d'abord c'est nouveau, complètement nouveau pour moi, une bonne raison de m'y plonger avec intérêt; et ensuite les défis à relever sont intéressants (c'est totalement incompréhensible... ), donc j'y reste, question de fierté personnelle ! Nan mé...

Reste que les modules me jouent des tours et que j'aurais besoin des lumières d'un savant!
Je suis en Windows XP SP3 avec Visual Studio 2010 Shell, F# 2.0.0.0 et Dotnet 4.0.30319, ce qui semble assez moderne.

Problème 1:
Citation:
Envoyé par LLB Voir le message
Chaque fichier (sauf le main) doit indiquer son nom de module ou namespace (au lieu de prendre le nom du fichier).
(Extrait d'un message pour la dernière livraison en 1.9.quelque-chose)
D'après mes essais (dans la configuration citée ci-dessus), il faut aussi le module dans le main, faute de quoi on a:
Citation:
Erreur 1 Files in libraries or multiple-file applications must begin with a namespace or module declaration, e.g. 'namespace SomeNamespace.SubNamespace' or 'module SomeNamespace.SomeModule'
Problème 2:
Voici mes 2 fichiers, Program.fs et Truc.fs
Code :
1
2
3
4
5
6
7
8
9
module Program
open System
open Truc
let a = Truc.N  //Test avec le préfixe Truc
let b = F 100   //Test sans le préfixe Truc
let c = Truc.Chouette.A //Test avec
let d = Chouette.A      //Test sans
printfn "a = %d, b = %d" a b
Console.ReadLine() |> ignore
Code :
1
2
3
4
5
6
module Truc
let N = 1234
let F x = x + 1

module Chouette =
  let A = 123
Tout ce que j'affiche en rouge est rejeté par Visual Studio avec le message "Erreur 1 The namespace or module 'Truc' is not defined" ou identique. A noter qu'il trouve bien System...
Donc, je résume: dès que je veux utiliser plus d'un fichier.fs, il faut mettre des modules, et pourtant il ne les voit pas. Kessifokejfai ?
Merci
Thorna est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2010, 13h12   #2
Max.Adorable
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Salut Thorna,

En ce qui concerne le fichier main, je pense que LLB parlait du fichier qui contient le point d'entrée du programme. L'équivalent du Main en C#.
Plus d'info ici, http://research.microsoft.com/en-us/...#_Toc270597618.

Pour ton problème de module, essaye de cette manière:

fichier2 (Truc.fs -> le nom du fichier est en général le nom du namespace/module défini dans ce dernier.):
Code :
1
2
3
4
5
6
7
8
namespace Truc

let N = 1234
let F x = x + 1

module Chouette =
  let A = 123
fichier1:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
open System
open Truc

[<EntryPoint>]
let main args = 
  let a = Truc.N  //Test avec le préfixe Truc
  let b = F 100   //Test sans le préfixe Truc
  let c = Truc.Chouette.A //Test avec
  let d = Chouette.A      //Test sans
  printfn "a = %d, b = %d" a b
  Console.ReadLine() |> ignore
Note bien que dans ta solution VS2010 le fichier2 doit être avant le fichier1.

Pour utiliser ce code dans la console interactive, généralement via le fichier script.fsx, tu dois charger le fichier du module/namespace désiré.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
#load "Truc.fs"

open System
open Truc

let a = Truc.N  //Test avec le préfixe Truc
let b = F 100   //Test sans le préfixe Truc
let c = Truc.Chouette.A //Test avec
let d = Chouette.A      //Test sans
printfn "a = %d, b = %d" a b
Console.ReadLine() |> ignore
Voilà quelques pistes qui j'espère résoudront ton problème. Si ce n'est pas le cas on t'aidera avec plaisir.

Max.
  Envoyer un message privé Réponse avec citation 00
Vieux 08/09/2010, 18h58   #3
Thorna
Membre éprouvé
 
Inscription : décembre 2004
Messages : 362
Détails du profil
Informations forums :
Inscription : décembre 2004
Messages : 362
Points : 418
Points : 418
Nom de Zeus (de nom de Zeus), comme disait un parent éloigné...
Citation:
Envoyé par Max.Adorable Voir le message
Note bien que dans ta solution VS2010 le fichier2 doit être avant le fichier1.
Et en plus, j'ai lu ça quelque part... Mais ça ne m'avait pas paru si clair que ça, d'autant que je n'ai pas l'habitude que l'ordre importe et que je ne voyais vraiment pas comment forcer un ordre quelconque dans Visual Studio... Tout simplement parce que dans ma version habituelle de VS C# 2010 Express, non seulement l'ordre n'importe pas mais en plus on ne peut pas le changer ! Et voilà qu'en cliquant-droit sur program.fs, je vois Move Up et Move Down, et même mieux : Add Above, Add Below, options qu'on ne voit pas en cliquant-droit sur le nom de la solution...
Alors après ça, tout rentre dans l'ordre tout seul : pas besoin de [<EntryPoint>] ni de let main args =, tout fonctionne du premier coup :
Code :
1
2
3
4
5
module Truc //Obligatoire
let N = 1234
let F x = x + 1
module Chouette =
  let A = 123
Code :
1
2
3
4
5
6
7
8
9
10
open Truc
open System

let a = Truc.N  //Test avec le préfixe Truc
let b = F 100   //Test sans le préfixe Truc
let c = Truc.Chouette.A //Test avec
let d = Chouette.A      //Test sans
printfn "a = %d, b = %d" a b
printfn "c = %d, d = %d" c d
Console.ReadLine() |> ignore
Citation:
Envoyé par Max.Adorable Voir le message
En ce qui concerne le fichier main, je pense que LLB parlait du fichier qui contient le point d'entrée du programme. L'équivalent du Main en C#.
Oui, j'avais bien compris ça comme ça, mais là encore, plus besoin du nom de module comme je l'avais cru.
Un grand merci, ça m'apprendra à lire les lignes en petits caractères en bas des pages...
Thorna est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2010, 09h39   #4
Max.Adorable
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Salut,

En effet il faut connaitre le move up/move down, maintenant tu ne l'oubliera plus jamais je pense ^^.

Max.
  Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 10h48.


 
 
 
 
Partenaires

Hébergement Web