почему вызов функции возвращает ошибку? - PullRequest
1 голос
/ 27 октября 2011

Я пробую следующий код в F # интерактив и получаю сообщение об ошибке FS0001: тип 'int -> int' не соответствует типу 'int'. Вот код, который я пытаюсь

> let rec factorial n = function
    | 0 -> 1
    | n -> n * factorial (n - 1);;

Это не из книжного примера «F3 для ученого». Спасибо,

Ответы [ 2 ]

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

Просто добавьте некоторые подробности о синтаксисе - ключевое слово function создает функцию, которая принимает аргумент (неявно, не называя его), а затем позволяет сопоставить шаблон с этим значением.

Естьдовольно много эквивалентных способов сделать это - используя function как описано в ildjarn:

let rec factorial = function
  | 0 -> 1
  | n -> n * factorial (n - 1)

Вы также можете объявить factorial как функцию, принимающую n, а затем использовать match:

let rec factorial n = 
  match n with
  | 0 -> 1
  | n -> n * factorial (n - 1)

И для полноты вы можете также создать функцию, используя fun (это более простая версия function, которая не дает вам возможности написать несколько случаев сопоставления с образцом):

let rec factorial = fun n ->
  match n with
  | 0 -> 1
  | n -> n * factorial (n - 1)

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

3 голосов
/ 27 октября 2011

Как вы уже определили, factorial принимает два аргумента, но вы передаете только один. Следовательно, вторая ветвь функции пытается умножить int на частично примененную функцию типа int -> int.

Первая строка должна читаться как

let rec factorial = function

(без n).

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