2017-02-18 19 views
0

Я пишу форму формы преобразования в OCaml, которая принимает функцию, а также принимает список для преобразования. Я понимаю, что что-то не так с моим сопоставлением шаблонов в терминах проверки типов, поскольку оно не будет компилироваться и утверждает, что типы не совпадают, но я не уверен, что именно не так с моими делами. Я получаю фактическую ошибку объявления, подчеркивая имя функции при попытке компиляции.OCaml Понимание функций и частичных приложений

let rec convert (fun: 'b -> 'c option) (l: 'b list) : 'c list = 
begin match l with 
| [] -> [] 
| h::tl -> if f h = Some h then h :: convert f tl 
     else convert f tl 

end 

Я написал следующий тест, который должен пройти, чтобы обеспечить правильную работу функции.

let test() : bool = 
let f = func x -> if x > 3 then Some (x + 1) else None in 
convert f [-1; 3; 4] = [5] 
;; run_test "Add one" test 

Я уверен, что ошибка находится где-то во втором совпадении.

ответ

1
  1. В случае возникновения ошибки компиляции вы должны сообщить точное сообщение об ошибке (а также о том, что компилятор жалуется).

  2. В h :: convert f tl, convert f tl является 'c list, но h является 'b, так что вы не можете комбинировать их, как это. Также нет f h = Some h: f h - 'c option и Some h - 'b option. Вы, наверное, хотите, чтобы соответствовать f h вместо:

    | h::tl -> match f h with 
          | Some h1 -> ... 
          | None -> ... 
    
+0

1. Сделает, спасибо за предложение. Эта ошибка подчеркивает имя функции, преобразование, в первой строке. 2. Когда вы говорите соответствие f h, вы имеете в виду замену соответствия шаблону h :: tl? Или совпадение со списком «b», l, во второй строке функции? Спасибо. – rubyquartz

+0

1. Вы также должны увидеть сообщение об ошибке, как показано ниже: https://ocaml.org/learn/tutorials/common_error_messages.html. Если вы этого не сделаете, это нужно сначала исправить, потому что сообщения об ошибках очень полезны. 2. Я продлил ответ (не полностью, потому что лучше, если вы попытаетесь его закончить). –