F # - сломано "тогда" - PullRequest
       1

F # - сломано "тогда"

2 голосов
/ 13 марта 2011

Я сейчас пытаюсь сделать очень простое приложение, которое будет приветствовать в зависимости от времени суток.Мой код:

open System

let read() = Console.Read() 
let readLine() = Console.ReadLine()

let clockMsg min max todo = 
    if (DateTime.Now.Hour > min) && (DateTime.Now.Hour < max) then todo

let name = readLine()

clockMsg 0 8 <| printfn "Go to bed, %s!" name
clockMsg 8 12 <| printfn "Good morning, %s!" name
clockMsg 12 18 <| printfn "Good afternoon, %s!" name

read() |> ignore

Теперь у меня вопрос, как может быть действительным только ОДИН из вызовов функций, но все три независимо от того, что, напечатают свои сообщения?

Ответы [ 3 ]

6 голосов
/ 13 марта 2011

Согласен с BrokenGlass. Что вы, вероятно, хотите сделать, это:

clockMsg 0 8 (fun() -> printfn "Go to bed, %s!" name)

и это изменение в clockMsg:

let clockMsg min max todo = 
    if (DateTime.Now.Hour > min) && (DateTime.Now.Hour < max) then todo()
4 голосов
/ 13 марта 2011
clockMsg 0 8 <| printfn "Go to bed, %s!" name

Это передает результат функции printfn в вашу функцию clockMsg - поэтому он оценивается до того, как ClockMsg даже запустится, поэтому вы видите все сообщения.

Также, поскольку он ничего не возвращает (или, более конкретно, результат типа unit ()), вы увидите в отладчике, что todo всегда передается как null.

1 голос
/ 13 марта 2011

просто чтобы упомянуть другой способ: вы можете передать в качестве аргумента ленивый <_>:

open System

let read() = Console.Read() 
let readLine() = Console.ReadLine()

let clockMsg min max (todo : Lazy<_>) = 
    if (DateTime.Now.Hour > min) && (DateTime.Now.Hour < max) then todo.Value

let name = readLine()

clockMsg 0 8 <| lazy(printfn "Go to bed, %s!" name)
clockMsg 8 12 <| lazy(printfn "Good morning, %s!" name)
clockMsg 12 18 <| lazy(printfn "Good afternoon, %s!" name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...