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"
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.
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 "&"
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