2016-05-23 4 views
2

Я думаю, что мне не хватает чего-то действительно простого здесь.Функция F # работает без вызова

Этот код

open System.Threading 

let duration = 1000 

module SequentialExample = 
    let private someTask item = 
     printfn "oh god why" 
     Thread.Sleep(duration) 
     item + " was computed" 

    let private items = [ 
     "foo" 
     "bar" 
     "baz" 
    ] 

    let getComputedItems = 
     printfn "heh" 
     [for item in items -> someTask item] 
     |> Array.ofList 

module ParallelExample = 
    let private someTask item = 
     printfn "that's ok" 
     Thread.Sleep(duration) 
     item + " was computed" 

    let private items = [ 
     "foo" 
     "bar" 
     "baz" 
    ] 

    let getComputedItems = 
     Async.Parallel [for item in items -> async { return someTask item }] 
     |> Async.RunSynchronously 

[<EntryPoint>] 
let main args = 
    ParallelExample.getComputedItems |> ignore 
    0 

Имеет следующий вывод:

heh 
oh god why 
oh god why 
oh god why 
that's ok 
that's ok 
that's ok 

Если я звоню ParallelExample модуль, почему F # работает код в SequentialExample модуле?

Что я делаю неправильно?

(Dear StackOverflow, перестать говорить «Похоже, ваш пост в основном код,., Пожалуйста, добавьте еще некоторые детали», на мой вопрос имеет достаточно деталей)

+2

По существу, в файле модуля, если в какой-то момент компилятор видит что-то вроде 'let a = ...' it myst вычисляет значение 'a' –

+0

Вы знаете, почему компилятор F # работает таким образом? – Gabriel

+1

ну, он должен вычислить его в какой-то момент, а начало - лучшее время. Это обязательно будет определено в спецификации где-то –

ответ

7

Как сказал Джон Палмер в комментариях, let getComputedItems = ... на самом деле значение, а не функция, , потому что функция должна принимать аргумент.

Чтобы сделать его функцией, его нужно объявить как let getComputedItems() = ....

+1

... или 'let getComputedItems = ... fun() -> ...' – Jay

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