Как изменить текст с помощью OCaml Containers.CCIO - PullRequest
0 голосов
/ 02 июня 2019

В документации ocaml-containers приведен отличный пример того, как читать файл и записывать содержимое в другой файл здесь . Тем не менее, я пытаюсь увидеть, что потребуется, чтобы изменить текст, прежде чем он будет передан из файла для чтения в файл для записи.

let read_filename = "example.ts"
let filename = "example2.ts"

let () =
  let modify_file ~chunks = 
    let r =  Str.regexp "text \\([A-Za-z]+\\)" in
    Str.replace_first r "\\1" chunks in

  CCIO.(
    with_in read_filename
      (fun ic ->
         let chunks = read_chunks ic in
         let new_chunks = modify_file chunks in
         with_out ~flags:[Open_binary] ~mode:0o644 filename
           (fun oc ->
              write_gen oc new_chunks
           )
      )
  )

Проблема с этим кодом в том, что компилятор жалуется:

File "component.ml", line 13, characters 39-45:
Error: This expression has type string gen = unit -> string option
       but an expression was expected of type string

Я пытаюсь выяснить, что я делаю неправильно, но безрезультатно. Любая помощь будет более чем признательна. Кроме того, более чем приветствуются предложения относительно идеального корпоративного программного обеспечения для использования в OCaml для изменения текста в файлах. Спасибо.

Ответы [ 2 ]

1 голос
/ 02 июня 2019

У вас проблема с печатанием read_chunk ic возвращает string gen значение

из здесь мы узнаем, что это функция, которая принимает значение единицы () и возвращает строку.

let () =
  CCIO.(
    let modify_file ~chunks = 
      let r =  Str.regexp "example \\([A-Za-z]+\\)" in
      match chunks () with
        None -> chunks (* is the same as (fun () -> None) *)
      | Some chunks ->
        let chunks = Str.replace_first r "\\1" chunks in (* compute once *)
        (fun () -> Some chunks) in
    with_in read_filename
      (fun ic ->
         let chunks = read_chunks ic in
         let new_chunks = modify_file ~chunks in
         with_out ~flags:[Open_binary] ~mode:0o644 filename
           (fun oc ->
              write_gen oc new_chunks
           )
      )
  )

EDIT: объяснить ошибки и изменения

РЕДАКТИРОВАТЬ 2: У меня есть модификатор modify_file, поэтому он возвращает другую строку gen и исправляет синтаксическую ошибку: когда вы используете помеченный аргумент, вам нужно добавить тильду при его вызове

0 голосов
/ 02 июня 2019

Какой тип modify_file.Я не вижу этого в руководстве.Вы должны попытаться добавить значение единицы () таким образом

let new_chunks = modify_file chunks () in и new_chunks будет иметь строковую опцию типа. Вы можете сопоставить шаблон как тип опции.

РЕДАКТИРОВАТЬ:

Я видел, что третий параметр имеет тип string gen Вы должны изменить 16-ую строку следующим образом: write_gen oc (fun () -> new_chunks)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...