2010-11-25 7 views
25

En F # interactive, je peux utiliser String.Join("+", ["a"; "b"]) avec succès, maisF #: String.Join et |> opérateur

["a"; "b"] |> String.Join "+" 

produit une erreur:

Script1.fsx(79,15): error FS0001: This expression was expected to have type 
    string list -> 'a  
but here has type 
    string 

Comment puis-je utiliser String.Join passer une collection en utilisant pipeline?

P.S. Le même problème est avec lines |> File.WriteAllLines "filename.txt"

Répondre

43

String.Join est une méthode .NET. Lors de l'utilisation d'une méthode .NET, F # la considère comme une fonction qui prend un tuple comme argument (lorsque vous l'appelez, vous écrivez les paramètres comme f(a, b)). L'opérateur |> peut être utilisé avec des fonctions qui utilisent le forme currid de paramètres (et peut être appelée en écrivant f a b).

Vous pouvez utiliser une fonction String.concat de la bibliothèque F # (ce qui fait la même chose) à la place:

["a"; "b"] |> String.concat "+" 

EDITFile.WriteAllLines est le même cas. Si vous voulez l'utiliser dans le cadre d'un pipeline, vous pouvez écrire une fonction F # qui enveloppe l'appel:

let writeAllLines file (lines:seq<string>) = 
    System.IO.File.WriteAllLines(file, lines) 

En général, vous pouvez utiliser |> avec des méthodes .NET uniquement si vous voulez écrire tous les arguments sur le côté gauche de l'opérateur. Vous pouvez par exemple écrire:

("+", ["a"; "b"]) |> System.String.Join 

... mais cela ne correspond pas à l'utilisation habituelle de l'opérateur de pipeline. Lorsque vous travaillez avec l'API .NET, il est généralement préférable d'utiliser un style de programmation similaire à C# (sans pipeline), car le pipeline fonctionne bien uniquement avec les bibliothèques fonctionnelles.

+0

Merci! Par ailleurs, un peu de chance avec 'File.WriteAllLines'? –

+0

ou ... toute méthode .Net ne fonctionnera pas avec '|>'? –

+0

@modosansreves: J'ai ajouté des réponses à vos autres questions. –

10

Je pensais que je pèserais avec une alternative. L'OP a spécifiquement posé des questions sur String.Join, et la réponse de Tomas Petricek est absolument correcte pour cette méthode (utilisez String.concat de la bibliothèque F #).

Si vous parlez une autre méthode qui prend des arguments uplées mais vous voulez les utiliser comme étrillé, vous pouvez utiliser cette fonction d'assistance:

let partial f x y = f(x, y) 

Cela vous permet de passer d'une méthode pour « partielle » et récupère une fonction au curry. Utilisez-le comme ceci:

let partial f x y = f(x, y) 
myCollection |> partial String.Join "&" 
Questions connexes