Предупреждение 10: это выражение должно иметь тип единицы - PullRequest
7 голосов
/ 31 октября 2011

Я пытаюсь создать список функций в Ocaml, но получаю предупреждение.Есть идеи, почему?

let f = [fun x -> -x; fun x -> x + 2; fun x -> x * x]

1 Ответ

10 голосов
/ 31 октября 2011

Точка с запятой также используется для завершения функций, которые используются для их побочных эффектов.Предупреждение появляется, когда тип возвращаемых данных этих функций не unit (в данном случае int);это всего лишь предупреждения, поскольку вы , возможно, намеревались использовать только побочные эффекты, обычно это ошибка.Это в стороне, но для подавления этих предупреждений программно и безопасно используйте функцию ignore, как в ignore (x+2);.

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

(fun x -> 
    let _ = -x in
    (fun y -> 
        let _ = y+2 in 
        (fun z -> z*z)))

Или, как указывает Гаше, другой пример,

(fun x -> 
    -x;
    (fun y -> 
        y+2;
        (fun z -> z*z)))

Вы можете отличить от возвращенного типа, (int -> int -> int -> int) list что-то мгновенно не в ваших намерениях.Вам нужно добавить круглые скобки вокруг каждого, например (fun x -> x+2);, чтобы создать список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...