Здесь я пытаюсь использовать факториальную функцию императивного стиля, но, несмотря на последнюю строку функции, объявляющую возвращаемый 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
Спасибо, указывая на ошибку в моей функции. Тем не менее, удаление первого делает только избавление от второй ошибки и удаление одного после цикла for дает ошибку, что у меня есть неполная структурированная конструкция. Альтернативная функция, которую вы предоставили, также дает мне первую ошибку. – GuitarGuy365
@ GuitarGuy365 Вам нужно 'do' после' for'. Я посмотрю на вашу другую ошибку, но я проверил этот код, и он сработал. – TheInnerLight
@ GuitarGuy365 Я думаю, что у вас нет '0' в конце вашей программы. Добавьте '0' в новую строку после' printfn ... '. 'main' должен возвращать' int'. – TheInnerLight