2015-12-31 5 views
2

Здесь я пытаюсь использовать факториальную функцию императивного стиля, но, несмотря на последнюю строку функции, объявляющую возвращаемый ref, fsc сообщает мне, что функция возвращает единицу. Я знаю, что mutables не разрешено возвращать, но я думал, что вы можете обойти это, используя ref? Кроме того, пожалуйста, не говорите мне, чтобы переписать его функциональным способом. Я знаю, что это альтернатива, но я пытаюсь лучше понять, как императивное программирование работает на языке.Функция возвращающего типа единицы вместо типа ref

Вот моя программа:

let factorial n = do 
    let res = ref 1 
    for i = 2 to n do 
     res := !res * i 
    res 

[<EntryPoint>] 
let main(args : string[]) = 
    let result = factorial 10 
    printfn "%d" !result 

Это то, что компилятор дает мне:

factorial.fs(2,5): warning FS0020: This expression should have type 'unit',  but 
has type 'int ref'. Use 'ignore' to discard the result of the expression, 
or 'let' to bind the result to a name. 

factorial.fs(10,13): error FS0001: Type mismatch. Expecting a 
    'a -> int 
but given a 
    'a -> unit 
The type 'int' does not match the type 'unit' 

factorial.fs(10,19): error FS0001: This expression was expected to have type 
    'a ref 
but here has type 
    unit 

ответ

2

Все, что вам нужно сделать, это удалить do, do, используемый в данном контексте, в частности, для выполнения стороны -эффекты, следовательно, ожидаемый тип возврата единицы.

Неверная вам функция, вам необходимо заменить n на номер i.

let factorial n = 
    let res = ref 1 
    for i = 2 to n do 
     res := !res * i 
    res 

Кстати, вам не нужно использовать ссылки, вы можете просто написать это:

let factorial n = 
    let mutable res = 1 
    for i = 2 to n do 
     res <- res * i 
    res 
+0

Спасибо, указывая на ошибку в моей функции. Тем не менее, удаление первого делает только избавление от второй ошибки и удаление одного после цикла for дает ошибку, что у меня есть неполная структурированная конструкция. Альтернативная функция, которую вы предоставили, также дает мне первую ошибку. – GuitarGuy365

+0

@ GuitarGuy365 Вам нужно 'do' после' for'. Я посмотрю на вашу другую ошибку, но я проверил этот код, и он сработал. – TheInnerLight

+0

@ GuitarGuy365 Я думаю, что у вас нет '0' в конце вашей программы. Добавьте '0' в новую строку после' printfn ... '. 'main' должен возвращать' int'. – TheInnerLight