Jestem względnie nowy dla Haskella i staram się nauczyć, jak różne akcje mogą być wykonywane sekwencyjnie za pomocą notacji. W szczególności, piszę program do benchmarku algorytm (funkcja)Jak wymusić ocenę w Haskell?
foo :: [String] -> [String]
W tym celu chciałbym napisać funkcję jak
import System.CPUTime
benchmark :: [String] -> IO Integer
benchmark inputList = do
start <- getCPUTime
let r = foo inputList
end <- getCPUTime
return (end - start) -- Possible conversion needed.
Ostatnia linia może wymagać konwersji (np. do milisekund), ale nie jest to tematem tego pytania.
Czy to jest właściwy sposób pomiaru czasu potrzebnego do obliczenia funkcji foo na niektórych argumentach inputList?
Innymi słowy, czy wyrażenie foo inputList
zostanie całkowicie zredukowane przed wykonaniem działania end <- getCPUTime
? Czy też r
będzie związany tylko z Thunk foo inputList
?
Ogólniej, jak mogę się upewnić, że wyrażenie zostanie w pełni ocenione przed wykonaniem jakiejś czynności?
To pytanie został poproszony kilka miesięcy temu na programistów (patrz here) i miał zaakceptowane odpowiedź tam, ale został zamknięty jako off-topic, ponieważ należy na przepełnienie stosu. Nie można przenieść pytania do przepełnienia stosu, ponieważ jest starsze niż 60 dni. Tak więc, w porozumieniu z moderatorami, ponawiam pytanie tutaj i sam przesyłam zaakceptowane pytanie, ponieważ uważam, że zawiera ono pewne przydatne informacje.
Jeśli interesuje tylko benchmarkingu, warto zapoznać się z [kryterium] (http://hackage.haskell.org/package/criterion) biblioteka. – hugomg
Funkcja 'foo' nie zostanie uruchomiona przed osiągnięciem ostatniej linii. Funkcje Haskell są oceniane tylko na żądanie, więc będziesz musiał zrobić coś z tą wartością 'r' przed przypisaniem do' końca'. –