Помощь при выводе типа в OCaml

Как бы я продолжил с доказательством того, что эти две функции хорошо напечатаны? Я немного растерялся с этим вопросом.

  let rec reduce f lst u =
     match lst with
     | [] -> u
     | (h::t) -> f h (reduce f t u) 

 let rec forall2 p l1 l2 =
     match (l1,l2) with
     | ([],[]) -> true
     | ([],_) -> false
     | (_,[]) -> false
     | ((h1::t1),(h2::t2)) ->
          (p h1 h2) && (forall2 p t1 t2)

1 ответ

Я не буду давать полноценное решение, так как вопрос выглядит как задание.

Чтобы сделать вывод типа самостоятельно, все, что вам нужно сделать, это посмотреть на источник и сделать выводы. Затем из ваших выводов выводите все больше и больше типов, пока все типы не станут известны или пока вы не обнаружите расхождение.

Для начала:

  • В reduce, вы соответствует шаблону lst против образцов типа 'a list, Таким образом, lst должен быть напечатан как 'a list,
  • Значения после каждого шаблона должны иметь одинаковый тип, поэтому u имеет тот же тип, что и f h (reduce f t u),

И так далее, и так далее...

Другие вопросы по тегам