2009-10-02 10 views
9

Clause de non-responsabilité:Total F # Newbie question!F # - Afficher les résultats complets dans F # fenêtre interactive

Si je tape ce qui suit dans un fichier F # dans Visual Studio

#light 

let squares = 
    seq { for x in 1 .. 10 -> x * x } 

printf "%A" squares 

et exécuter F # interactive sur elle en mettant en valeur et en appuyant sur Alt + Entrez, la sortie dans la fenêtre interactive est

> 
seq [1; 4; 9; 16; ...] 
val squares : seq<int> 

> 

Mais je veux voir la séquence complète à savoir

> 
seq [1; 4; 9; 16; 25; 36; 49; 64; 81; 100] 
val squares : seq<int> 

> 

Est-ce possible? J'espère qu'il y a un cadre pour cela que j'ai manqué.

Répondre

9

'seq' est une construction évaluée paresseusement; il pourrait être infini, c'est pourquoi FSI ne montre que les premières valeurs. Si vous voulez tout voir, une chose facile à faire est de convertir en une liste, par ex.

printf "%A" (squares |> Seq.tolist) 
+0

Merci Brian, c'est tout à fait logique maintenant. Est-il possible de demander à FSI d'évaluer toutes les valeurs de la gamme de compréhension de seq (si c'est la bonne terminologie)? –

+5

@Russ, c'est effectivement ce que le transformer en une liste fera ... Sinon, vous devez faire Seq.iter (printfn "% A") carrés – Benjol

+0

Je remarque printfn "% A" [1 .. 2000] ne montre que les 100 premières valeurs. La solution de Benjol imprimera la liste entière. – Juliet

9

Si vous souhaitez afficher toutes les valeurs de la séquence sans transformer en une liste, vous pouvez itérer directement sur la séquence comme ceci:

Seq.iter (printfn "%A") squares 

Notez que vous prenez un risque: Si, comme le laisse entendre Brian, la séquence est infinie, vous pourriez attendre assez longtemps. (Dans ce cas, Seq.skip et Seq.take sont vos amis)

+0

Sur une note connexe, cette solution 'iter' fonctionne également lors de l'impression de grands tableaux sur la console dans son intégralité, c'est-à-dire Array.iter (printfn "% A") –