2009-07-05 10 views
3

компилируется и работает:Почему это не компилируется в F #

 
let rec HelloEternalWorld _ = 
    Console.ReadLine() |> printf "Input: %s\n" 
    HelloEternalWorld 0 

HelloEternalWorld 0 

Это не компилируется:

 
let rec HelloEternalWorld = 
    Console.ReadLine() |> printf "%s\n" 
    HelloEternalWorld 

HelloEternalWorld 

Я пытаюсь понять, почему нет?

ответ

7

Все, что вам не хватает в круглые скобки, как было бы составить, если бы это было:


let rec HelloEternalWorld() = 
    Console.ReadLine() |> printf "%s\n" 
    HelloEternalWorld() 


Чтобы определить функцию без аргументов, вам нужно скобки, чтобы отличить функцию от простого значения.

4

Пожалуйста, разместите сообщение об ошибке, которое вы получите, они говорят все, что вам нужно!

Значение ... будет оцениваться как часть его собственного определения.

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

Для того, чтобы сделать эту функцию, вы должны написать что-то вроде

let rec HelloEternalWorld() = 
    Console.ReadLine() |> printfn "%s" 
    HelloEternalWorld() 

, которая теперь является функцией типа unit -> unit.

Смежные вопросы