Ocaml - сопоставление двух списков - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь написать случайную функцию в OCaml, но есть проблема с выводом типа. Мерлин говорит мне, что l1 и l2 имеют тип 'a list list, что неверно, потому что они только 'a list. Почему он так утверждает?

let shuffle l1 l2 =
  let rec scan l1 l2 acc =
    match (l1, l2) with
    | [],[] -> acc
    | ([],h2::t2) -> scan [] t2 h2::acc
    | (h1::t1, []) -> scan t1 [] h1::acc
    | (h1::t1,h2::t2) -> scan t1 t2 h1::h2::acc
  in scan l1 l2 []
;;

1 Ответ

0 голосов
/ 09 ноября 2018

Основная причина в том, что приоритет оператора не определяется вашей группировкой по пробелам. Таким образом, scan [] t2 h2::acc интерпретируется как (scan [] t2 h2)::acc, а не scan [] t2 (h2::acc), поскольку приложение функции имеет более высокий приоритет, чем ::. Исправление заключается в простом добавлении скобок, где это уместно.

См. в этой таблице для определения приоритета и ассоциативности различных операторов в OCaml.

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