2016-07-12 5 views
4

Когда я запускаю следующий бит кода, я получаю 5050 от mySum. Я определил mySum, но никогда не вызывал его. Как он может печатать вообще? Возможно, это странно, потому что мой фон - Haskell, и я привык передавать монаду IO, чтобы что-то делать - как/когда вещи оцениваются в F #?Почему printfn печатает сразу в f #?

type main = obj [] -> int 

let mySum = [1..100] |> List.sum |> printfn "%i" 


[<EntryPoint>] 
let main argv = 
    0 

ответ

13

Я определил mySum, но никогда не вызывается его.

mySum не является функцией, так как он не принимает никаких параметров. Функция должна иметь хотя бы один аргумент; если ничего «полезного» не может быть передано, что обычно будет unit значение ().

mySum - значение; более конкретно, вы связываете значение выражения [1..100] |> List.sum |> printfn "%i" с именем mySum. Это значение, в свою очередь, составляет (), так как printfn вызывает только побочный эффект и возвращает unit. Выражение оценивается немедленно, когда значение привязано, и все, что остается, - это побочный эффект и фактическое значение.

Как функция, mySum будет выглядеть следующим образом:

let mySum() = [1..100] |> List.sum |> printfn "%i" 

И называть это будет просто

mySum() 

Это вызвало бы значение 5050 быть распечатаны, а возвращаемое значение () будет автоматически игнорироваться.

+3

Это настолько странно. Что такое ценность? Не 5 функция, которая возвращает 5? Очень различная парадигма. – Carbon

+3

Если '5' была функцией, которая возвращает' 5', то не будет ли вторая секунда '5' также функцией, которая возвращает' 5' и т. Д.? В какой-то момент у вас должны быть значения. Вы случайно приехали из Хаскелла? –

+2

Мое личное мнение из моего очень ограниченного (и не очень положительного) опыта с Haskell заключается в том, что для первого попадания в F # мышление Haskell не очень полезно, потому что языки действительно имеют несколько разные подходы. Самое главное, что нужно знать о том, что в отличие от Haskell, F # не является чистым функциональным языком. Как только F # и его конкретные «причуды» станут более естественными, мышление Haskell, вероятно, снова станет более ценным. – TeaDrivenDev

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