Почему при использовании возвращаемого значения List.fold_left возникает ошибка типа? - PullRequest
0 голосов
/ 09 апреля 2019

Я пытаюсь использовать список, возвращенный из List.fold_left в списке типа pExp (пользовательский тип). Цель этого состоит в том, чтобы создать список Times (pExp list) со списком, соответствующим типу Plus l.

let eval (lst: pExp list): pExp list = 
    match lst with
    | [] -> []
    | other patterns
    | Plus l::t -> (List.fold_left (fun acc a -> Times(a::t)::acc) lst)
    (* For each item a in l, append it to t and make it a Times *)
    | _ -> []

Я ожидал, что List.fold_left вернет список pExp, но я получаю эту ошибку.

Error: This expression has type pExp list -> pExp list but an expression was expected of type pExp list Первая строка в сообщении об ошибке указывает, что fold_left возвращает pExp, что именно то, что ожидается, нет?

1 Ответ

2 голосов
/ 09 апреля 2019

Это выражение:

(List.fold_left (fun acc a -> Times(a::t)::acc) lst)

имеет тип функции.List.fold_left принимает 3 аргумента, а вы передаете здесь только 2.

Компилятор говорит, что вы предоставляете тип функции (pExp list -> pExp list), где не-тип функции (pExp list)) ожидалось.И это действительно проблема.

Скорее всего, вы пропустили начальное значение между функцией и lst.

...