F#: Cadena.Unirse y / > operador


En F # interactive, puedo usar String.Join("+", ["a"; "b"]) con éxito, pero

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

Produce un error:

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

¿Cómo uso String.Join pasar una colección usando pipeline?

P.d. El mismo problema es con lines |> File.WriteAllLines "filename.txt"

Author: bohdan_trotsenko, 2010-11-25

2 answers

String.Join es un método. NET. Cuando se usa un método. NET, F # lo ve como una función que toma una tupla como argumento (cuando lo llama, escribe parámetros como f(a, b)). El operador |> se puede usar con funciones que usan la forma curried de parámetros (y se puede llamar escribiendo f a b).

Puede usar una función String.concat de la biblioteca F# (que hace lo mismo) en su lugar:

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

EDITAR File.WriteAllLines es el mismo caso. Si desea utilizarlo como parte de un pipeline, puede escribir una función F# que envuelva la llamada:

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

En general, puede usar |> con métodos.NET solo si desea escribir todos los argumentos en el lado izquierdo del operador. Por ejemplo, puede escribir:

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

... pero eso no encaja con el uso habitual del operador de tuberías. Cuando se trabaja con. NET API, generalmente es mejor usar un estilo de programación similar a C#(sin pipelining), porque pipeline solo funciona bien con bibliotecas funcionales.

 48
Author: Tomas Petricek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-11-25 15:48:19

Pensé que me opondría a una alternativa. El OP preguntó específicamente sobre String.Join, y la respuesta de Tomas Petricek es absolutamente correcta para ese método (use String.concat de la biblioteca F#).

Si estás hablando de otro método que toma argumentos tupleados pero quieres usarlos como curried, puedes usar esta función auxiliar:

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

Esto le permite pasar un método a 'partial' y recuperar una función curry. Úsalo así:

let partial f x y = f(x, y)
myCollection |> partial String.Join "&"
 12
Author: Richiban,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-21 12:01:38