Просто для пояснения, я думаю, что фраза "функция, которая не принимает параметров" вводит в заблуждение. По определению, функция отображает значение из области функции в значение в диапазоне функции, поэтому все функции принимают параметры. В вашем случае getRand
не привязан к функции, это просто значение типа int
.
Если я правильно понимаю ваш вопрос, я думаю, что вы хотите сделать
let getRand =
let seed = int System.DateTime.Now.Ticks
let randGen = new System.Random(seed)
fun () -> randGen.Next()
Вам все еще нужно вызывать getRand
как функцию (getRand()
, а не просто getRand
), но нет способа обойти эту проблему - тот факт, что значение int
всегда остается неизменным, является критически важным функция рассуждений о программе.
Вы можете использовать вашу функцию getRand2
почти так же, как моя версия getRand
: поскольку вы не используете dummyParam
в теле, F # делает функцию универсальной, что означает, что вы можете передать значение единицы ()
в качестве аргумента, если хотите. Однако , ваша функция getRand2
не работает, так как она создает новый генератор случайных чисел при каждом вызове. Это означает, что если вы позвоните дважды в течение одного тика, вы получите один и тот же ответ:
let x,y = (getRand2(), getRand2())
Именно поэтому важно определить seed
и randGen
вне области действия анонимной функции.