2014-09-18 3 views
3

Я играл вокруг F # и заметил проблему, которую я не могу понять. Скажем, я хочу получить ряд целочисленных входов от пользователя и хранить его в массиве:F # for loop error

[<EntryPoint>] 
let main = 
    let n = Console.ReadLine() |> int 
    let inputVals = Array.zeroCreate n 
    for i in 0 .. n - 1 do 
     inputVals.[i] <- (Console.ReadLine() |> int) 
    printf "%A\n" inputVals 
    0 //compiler error here. The type does not match the expected type 

Но это дает ошибку

This expression was expected to have type string [] -> int but here has type int 

После некоторых игр вокруг, я подозреваю, что ошибка исходит от для цикла. Но я не могу понять, почему он ожидает строку [] -> int. Это кажется очень простой проблемой, но я просто могу понять, что происходит.

ответ

5

Ошибка здесь не связана с самим циклом. Вы используете main как значение, но оно должно быть функцией от массива строк до int.

[<EntryPoint>] 
let main args = 
    // Your stuff here 
    0 

где args будет выведено в string[]. Если вы чувствуете многословным, вы можете объяснить это:

[<EntryPoint>] 
let main (args : string[]) = 
    // Your stuff here 
    0 

Все остальное в порядке.

+0

Спасибо, что сделал трюк. Означает ли это, что F # не позволяет точке входа не иметь входных аргументов. В принципе это возможно в F #: 'public static void Main()'? – mashrur

+0

@ mashrur Я уверен, что вы не можете этого сделать. Функция сигнатуры точки входа - ['string [] -> int'] (http://msdn.microsoft.com/en-us/library/dd402151.aspx), и это все :) –

+4

@mashrur Аргументы всегда есть, но вы можете, конечно, игнорировать их: 'let main _ = ...' – Tarmil