Преобразование seq <string>в строку [] в F # - PullRequest
0 голосов
/ 27 мая 2011

Пример из этого поста содержит пример

open System.IO

let lines = 
  File.ReadAllLines("tclscript.do")
  |> Seq.map (fun line ->
      let newLine = line.Replace("{", "{{").Replace("}", "}}")
      newLine )

File.WriteAllLines("tclscript.txt", lines)

, который выдает ошибку при компиляции.

error FS0001: This expression was expected to have type
    string []    
but here has type
    seq<string> 

Как преобразовать seq в строку []удалить это сообщение об ошибке?

Ответы [ 3 ]

6 голосов
/ 27 мая 2011

Опираясь на ответ Хайме, поскольку ReadAllLines() возвращает массив, просто используйте Array.map вместо Seq.map

open System.IO

let lines = 
  File.ReadAllLines("tclscript.do")
  |> Array.map (fun line ->
      let newLine = line.Replace("{", "{{").Replace("}", "}}")
      newLine )

File.WriteAllLines("tclscript.txt", lines)
6 голосов
/ 27 мая 2011

Вы можете использовать

File.WriteAllLines("tclscript.txt", Seq.toArray lines)

или просто присоединить

|> Seq.toArray

после вызова Seq.map.

(Также обратите внимание, что в .NET 4существует перегрузка WriteAllLines, которая занимает Seq)

0 голосов
/ 27 мая 2011

Лично я предпочитаю выражения последовательности, а не функции высшего порядка, если только вы не передаете вывод через ряд функций. Обычно он чище и более читабелен.

let lines = [| for line in File.ReadAllLines("tclscript.do") -> line.Replace("{", "{{").Replace("}", "}}") |]
File.WriteAllLines("tclscript.txt", lines)

С заменой регулярного выражения

let lines = 
  let re = System.Text.RegularExpressions.Regex(@"#(\d+)")
  [|for line in File.ReadAllLines("tclscript.do") ->
      re.Replace(line.Replace("{", "{{").Replace("}", "}}"), "$1", 1)|]
File.WriteAllLines("tclscript.txt", lines)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...