F #: String.Join и |> оператор - PullRequest
35 голосов
/ 25 ноября 2010

В интерактивном режиме F # я могу успешно использовать String.Join("+", ["a"; "b"]), но

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

выдает ошибку:

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

Как использовать String.Join, передавая коллекцию с помощью конвейера?

PS Та же проблема с lines |> File.WriteAllLines "filename.txt"

Ответы [ 2 ]

58 голосов
/ 25 ноября 2010

String.Join - это метод .NET. При использовании метода .NET F # рассматривает его как функцию, которая принимает кортеж в качестве аргумента (при вызове его вы записываете параметры как f(a, b)). Оператор |> может использоваться с функциями, которые используют карри в форме параметров (и могут быть вызваны записью f a b).

Вместо этого вы можете использовать функцию String.concat из библиотеки F # (которая делает то же самое):

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

РЕДАКТИРОВАТЬ File.WriteAllLines тот же случай. Если вы хотите использовать его как часть конвейера, вы можете написать функцию F #, которая переносит вызов:

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

Как правило, |> можно использовать с методами .NET, только если вы хотите записать все аргументы в левой части оператора. Например, вы можете написать:

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

... но это не соответствует обычному использованию оператора трубопровода. При работе с .NET API обычно лучше использовать стиль программирования, подобный C # (без конвейерной обработки), поскольку конвейер хорошо работает только с функциональными библиотеками.

15 голосов
/ 24 февраля 2014

Я думал, что буду взвесить альтернативу. ОП специально спросил о String.Join, и ответ Томаса Петричека абсолютно верен для этого метода (используйте String.concat из библиотеки F #).

Если вы говорите о другом методе, который принимает набор аргументов, но вы хотите использовать их как карри, вы можете использовать эту вспомогательную функцию:

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

Это позволяет вам передавать метод в «частичное» и возвращать карри функцию. Используйте это так:

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