F #: ожидалось, что это выражение будет иметь тип DateTime, но здесь есть тип блока - PullRequest
0 голосов
/ 03 мая 2018

Функция F # ниже не компилируется

open System
let checkCreation time : DateTime = 
    if (time > DateTime.UtcNow.AddDays(-7.0)) then printfn "New"
    else printfn "Old"

checkCreation time

Маркеры ошибок указывают на «Новый» и «Старый»

Компилятор завершается с ошибкой:

Script1.fsx (3,59): ошибка FS0001: ожидалось, что это выражение будет иметь тип

DateTime    

но здесь есть тип

unit    

Почему компилятор ожидает DateTime, когда я просто пытаюсь что-то напечатать через printfn?

1 Ответ

0 голосов
/ 03 мая 2018

заменить это

let checkCreation time: DateTime = 

с этим

let checkCreation (time: DateTime) = 

Первый имеет подпись (DateTime -> DateTime), потому что вы явно наложили это ограничение на вывод функции. Входные данные были выведены компилятором.

Второй подпись (DateTime -> unit). Ввод был явно ограничен, а вывод unit выведен

Добавлено:

Полная явная подпись должна выглядеть следующим образом

let checkCreation (time: DateTime) : unit = 
    ...

Вы можете удалить все явные ограничения типов и заставить компилятор работать:

//because time argument compared to DateTime it is inferred to be DateTime
//No explicit constrain needed
let checkCreation time = //DateTime -> unit

    //because if expression is the last one, its output will be used as function output
    if (time > DateTime.UtcNow.AddDays(-7.0))
    //because then branch has unit output, function output will be inferred as unit
    then printfn "New" 
    //else branch output MUST match with then branch. Your code pass :)
    else printfn "Old"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...