Rozważ funkcję preludium words
; to jest bardzo proste i można napisać go w następujący sposób:Dlaczego funkcja słów Preludium nie jest prostsza?
words' :: String -> [String]
words' [] = []
words' str = before : words' (dropWhile isSpace after) where
(before, after) = break isSpace str
Jednak zauważyłem, że jej oryginalny kod Prelude wydaje się o wiele mniej ... naturalne:
words :: String -> [String]
words s = case dropWhile {-partain:Char.-}isSpace s of
"" -> []
s' -> w : words s''
where (w, s'') =
break {-partain:Char.-}isSpace s'
Zakładam, że istnieją przyczyny związane z optymalizacją. Pytanie brzmi: czy nie mogę się spodziewać, że kompilator powinien zoptymalizować funkcję words'
tak samo dobrze, jak jej wersję Prelude? Użyłem tych samych funkcji (break
, dropWhile
, isSpace
).
byłem kiedyś bardzo zaskoczony, że GHC nie wykonywać niektóre z najprostszych optymalizacje niskopoziomowych:
C vs Haskell Collatz conjecture speed comparison
ale na bok dla {-partain:Char.-}
bitów (wskazówka dla kompilatora nie wydaje się bardzo pomocne w ta sytuacja IMO) kod words
wydaje się niepotrzebnie nadęty dla języka wysokiego poziomu. Jaki jest tego powód?
Nie sądzę, że bit '{-partain: Char .-}' jest czymś więcej niż komentarzem do nazwy modułu, przy okazji. Według Google, ktoś o nazwisku Partain pracował nad GHC jakiś czas temu. Zgaduję, że to tylko on podpisał swoje komentarze. – hammar
Och, myślałem, że to mogło mieć jakiś wpływ na kompilator. Fajny połów z Partainem! – ljedrz
To będzie Partain. – augustss