Почему возвращаемый тип этого выражения рассчитывается для возврата типа unit-> int вместо int - PullRequest
0 голосов
/ 14 июля 2020

Я новичок в F # и пишу функцию для преобразования значения dateTime в unix отметку времени в секундах. Ниже представлена ​​моя реализация такой функции (просто с использованием встроенной функции и ее обертыванием для обучения).

let DateTimeToUnix x =
        let result = DateTimeOffset(x).ToUnixTimeSeconds
        result

Ожидаемый тип возврата: DateTime -> int64 Фактический тип возврата: DateTime-> (unit-> int64)

Я пытался найти похожие вопросы, и ближайший, который я нашел, был примерно таким ( F # - тип int несовместим с типом unit ), но, к сожалению, я не понимаю, как это применимо в этом случае, поскольку используемый тип возвращаемого значения функции (ToUnixTimeSeconds) - это int64, а не (unit-> int64).

Было бы здорово, если бы кто-то мог указать, где узнать об этом, или может объясните поведение. Большое спасибо за ваше время.

Ответы [ 2 ]

3 голосов
/ 14 июля 2020

ToUnixTimeSeconds - это метод , а не свойство. В F # методы моделируются как функции. Методы без параметров моделируются как функции с одним параметром типа unit. Таким образом, тип foo.ToUnixTimeSeconds будет unit -> int64, как и сообщает вам компилятор.

Чтобы фактически вызвать эту функцию и получить от нее результат, дайте ей параметр того типа, который она ожидает - т.е. unit:

let DateTimeToUnix x =
    let result = DateTimeOffset(x).ToUnixTimeSeconds ()
    result

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

let DateTimeToUnix x =
    DateTimeOffset(x).ToUnixTimeSeconds ()
1 голос
/ 14 июля 2020

Вы должны вызвать ToUnixTimeSeconds перед его возвратом, чтобы получить желаемый тип возврата:

let DateTimeToUnix x =
    let result = DateTimeOffset(x).ToUnixTimeSeconds() // invoke method: ()
    result
...