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

Запись функции времени в Haskell

Im new, чтобы Haskell и Id хотели иметь возможность запускать время выполнения заданного вызова функции или фрагмента кода.

В Clojure я могу использовать time:

user=> (time (apply * (range 2 10000)))
"Elapsed time: 289.795 msecs"
2846259680917054518906413212119868890148051...

В Scala я могу сам определить функцию:

scala> def time[T](code : => T) =  {
     |   val t0 = System.nanoTime : Double
     |   val res = code
     |   val t1 = System.nanoTime : Double
     |   println("Elapsed time " + (t1 - t0) / 1000000.0 + " msecs")
     |   res
     | }
time: [T](=> T)T

scala> time((1 to 10000).foldLeft(1:BigInt)(_*_))
Elapsed time 274.292224 msecs
res0: BigInt = 284625968091705451...

Как я могу записать эквивалент моей функции Scala или Clojure "в Haskell? Модуль System.TimeIt, который я нашел в Hackage, недостаточно общий, потому что он работает только при измерении вычисления ввода-вывода. Таким образом, timeIt(4 + 4) не работает, только timeIt(print $ 4 + 4), что быстро раздражает. Кроме того, я действительно хочу видеть, как Haskell обрабатывает общий случай.

Спасибо!

4b9b3361

Ответ 1

Для этого используйте стандартные библиотеки:

Просто используйте критерий.


Замечание по глубине оценки: лень означает, что вам нужно решить, какую оценку вы хотите иметь во время вашего выбора времени. Как правило, вы захотите уменьшить свой код до нормальной формы. Класс NFData позволяет вам выполнить это с помощью метода rnf. Если оценка внешнего конструктора в порядке, используйте seq для вашего чистого кода, чтобы заставить его оценить.

Ответ 2

Haskell лениво оценивается. Если ваше выражение не имеет какого-либо побочного эффекта (как закодировано в IO-монаде или т.п.), Тогда программе не нужно фактически разрешать выражение для значения, и так не будет.

Чтобы получить значимые числа из этого, вы можете попробовать синхронизацию print 4 и print expr и принять разницу, чтобы удалить издержки форматирования строк и ввода-вывода.

Ответ 3

Lazy означает Lazy. Время имеет значение только в том случае, если внутри монады, например, IO.

Время не имеет значения в выражении "4 + 4" - или в любом другом математическом уравнении. Ответ просто IS. "Ответ" на любое другое чистое вычисление уже предопределено в тот момент, когда задано вычисление.

К сожалению, это "ответ" на ваш вопрос. Ответ, который, по сути, существовал до того, как вы задали свой вопрос. Он существовал в 1998 году, когда язык был окончательно определен. Тот факт, что мне понадобился год, чтобы написать это, не имеет значения; -)

Хорошо, хватит этой ерунды!!!! (Но если выше это слишком раздражает, тогда просто забудьте о Haskell.)

Если пакет Criterion слишком силен, просто напишите тестовый пример и используйте + RTS для его проверки.

Если вы хотите быть действительно здорово, создайте свою собственную монаду - одну раз, когда вы выполняете свой алгоритм, и отдавайте результат обратно обратно с возвращаемым значением алгоритма. Удачи. Мы все рассчитываем на вас!