Ocaml - неправильный тип - PullRequest
       5

Ocaml - неправильный тип

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

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

type 'a tree = Node of 'a * 'a tree list;;

let rec fold_tree f (Node (x,l)) =
f x (map (fold_tree f) l);;

let is_balanced t =
  fst(
    fold_tree 
      (fun _ (l: (bool * int) list ) ->  
        ((fold_left
           (fun h (flag,first_value)-> 
             ((fst h)=first_value)&&flag,first_value)
           (true,snd(hd l) ) 
           l))
       )
   t);;

Проблема есть:

((fold_left(fun h (flag,first_value)-> ((fst h)=first_value)&&flag,first_value) (true,snd(hd l) ) l))

Ocaml говорит мне, что это тип bool * bool, но я уверен, что это тип bool * int, потому что l - это тип списка (bool * int), поэтому hd l - это тип (bool * int), так что (hd l) - это тип int ...

1 Ответ

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

Несколько советов:

  • Назовите свои посреднические функции
  • Не открывайте List
  • Избегайте использования List.hd (чтобы правильно обращаться с пустымсписок дел)
  • Верьте проверке типов
  • Используйте аннотации типов при отладке с помощью справки проверки типов

В вашем случае вам следует взглянуть на тип вашейвнутренняя функция

fun (h:'a) (flag,first_value): 'a-> 
  (fst h=first_value) && flag,first_value
...