Простое упражнение OCaml - PullRequest
       1

Простое упражнение OCaml

4 голосов
/ 15 октября 2011

Я пытаюсь научить себя OCaml через заметки Джейсона Хикки, и следующее упражнение поставило меня в тупик.Вопрос: Напишите функцию sum , которая дает две целочисленные границы m, n , а функция f вычисляет суммирование.Я пытаюсь это:

     let rec sum m n f=
     if m>n then 0
     else if m=n then f n
     else f m + sum n m+1 f

, но это не работает, вызывая ошибку типа.

Ответы [ 2 ]

7 голосов
/ 15 октября 2011

Вам нужно несколько скобок.

let rec sum m n f=
     if m>n then 0
     else if m=n then f n
     else f m + sum n (m+1) f

(Хотя для удобства чтения я обычно заключал бы в скобки последнюю строку, как иначе (f m) + (sum n (m+1) f).) Что происходит без скобок, так это то, что он обрабатывает его как (f m) + (sum n m) + (1 f), что приводит к ошибке, что sum n m не имеет тип int, поскольку это приложение с частичной функцией более сложного типа.

Как правило, когда выражение передается в качестве аргумента функции, оно всегда должно заключаться в скобки. Что касается примечания, если вы когда-нибудь действительно хотели передать функцию плюс в качестве аргумента, вы бы поставили ее в скобки (например: sum m n (+) (хотя в этом случае проверка типов не выполнялась бы, так как + ожидает два числа) ).

6 голосов
/ 15 октября 2011

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

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