Ошибка компиляции OCaml: синтаксическая ошибка: ожидается путь к модулю - PullRequest
0 голосов
/ 29 апреля 2020

Поскольку в Google ничего об этом нет, я открыл эту проблему.

Я пытаюсь скомпилировать этот код:

module Random: Mirage_random.S = struct 
  include Mirage_random_stdlib
end

module Ipv4: Static_ipv4.Make(Random, Clock, Ethernet, Arp) = struct
  include Static_ipv4
end

, но я получаю это:

root@66f08fd7c55b:/workspaces/ocaml_env/mirage-tcpip/examples/raw_ip_tcp_example# dune build raw_ip_tcp_example.exe
Entering directory '/workspaces/ocaml_env/mirage-tcpip'
File "examples/raw_ip_tcp_example/raw_ip_tcp_example.ml", line 44, characters 36-37:
44 | module Ipv4: Static_ipv4.Make(Random, Clock, Ethern
                                         ^
Error: Syntax error: module path expected.

Вы можете увидеть файл static_ipv4 здесь https://github.com/mirage/mirage-tcpip/blob/master/src/ipv4/static_ipv4.mli#L17

Я понятия не имею, почему происходит эта ошибка. Я не включил Clock, Ethernet, Arp, потому что ошибка уже на Random. Вы можете увидеть случайную подпись здесь: https://github.com/mirage/mirage-random/blob/master/src/mirage_random.ml и реализацию, которую я включаю здесь https://github.com/mirage/mirage-random-stdlib

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Во-первых, у вас есть синтаксическая ошибка, приложение функтора должно быть написано:

Static_ipv4.Make(Random)(Clock)(Ethernet)(Arp)

Тогда у вас есть ошибка типа: Static_ipv4.Make(Random)(Clock)(Ethernet)(Arp) - это выражение модуля, а не тип модуля. Более того, неясно, нужно ли вам даже ограничение подписи. Простое написание

module Ipv4 = struct
  include Static_ipv4
  let more = 0
end

работает, если вы хотите создать расширенную версию модуля Static_ipv4.

Но, возможно, вы хотели добавить несколько функций к результату функтора? В этом случае вы можете использовать:

module Ipv4 = struct
  include Static_ipv4.Make(Random)(Clock)(Ethernet)(Arp)
  let an_new_and_shiny_function = ()
end

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

module Ipv4: sig
  include Mirage_protocols.IP with type ipaddr = Ipaddr.V4.t
  val connect : ip:(Ipaddr.V4.Prefix.t * Ipaddr.V4.t) -> ?gateway:Ipaddr.V4.t ->
  end
 = struct
  include Static_ipv4.Make(Random)(Clock)(Ethernet)(Arp)
  let an_new_and_shiny_function.
end
0 голосов
/ 29 апреля 2020

Я вообще не знаю о Мираже, но условно, что Фей - это функтор. Т.е. он отображает модули в модули. Но у вас есть вызов в позиции syntacti c типа модуля.

Я бы ожидал чего-то более похожего на это:

module Ipv4 = Static_ipv4.Make(. . .)

Приношу свои извинения, если это не поможет.

...