Помощь при выводе типа в 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)
,
И так далее, и так далее...