Подтвердить что ты не робот

F # - Функция без аргументов?

Когда мы думаем в функциональном мышлении, учитывая, что функции должны быть чистыми, можно заключить, что любая функция без аргументов является в принципе просто значением. Тем не менее, повторное использование мешает, и с разными входами мне может не понадобиться определенная функция, и если эта функция является дорогостоящей с точки зрения затрат, я бы не хотел ее оценивать, если она не нужна.
Я нашел обходное решение, используя let func _ = ... и назвав его с помощью func 1 или что-то еще, но это очень неидиоматично и сбивает с толку читателя.

Это сводится к одному вопросу: В F # существует ли способ объявить функцию с нулевыми аргументами, не оценив ее при объявлении?

4b9b3361

Ответ 1

Обычная идиома - определить функцию для принятия одного аргумента типа Unit (let functionName () = 42). Затем он будет называться functionName (). (Тип устройства имеет только одно значение, которое равно ().)

Ответ 2

Я думаю, что вы хотите lazy.

let resource = 
    lazy(
        // expensive value init here
    )

Затем, когда вам нужно прочитать значение...

resource.Value

Если вы никогда не вызываете свойство Value, код внутри блока lazy никогда не запускается, но если вы его вызываете, этот код будет запускаться не более одного раза.