Mam kilka powiązań, które chcę zachować jako prywatne dla funkcji (tak, nie zadeklarowane w przestrzeni nazw modułu najwyższego poziomu), ale które są kosztowne do obliczenia, więc wolałbym, aby były CAF. Czy istnieje pragma lub jakaś inna sztuczka, którą mógłbym użyć, aby wymusić na GHC CAF dla tych wiązań?W jaki sposób można wymusić powiązania w klauzuli where jako CAF?
przykładowy kod:
header :: HeaderProps -> Element
header = div_ [style_ headerStyle] [str_ "Here be headerz"]
where
-- Creating the 'headerStyle' is expensive! Do it only once
-- regardless of how many times the 'header' function is used.
headerStyle = mkStyle $ do
display flex
flexDirection column
padding (px 20) (px 40)
Jeśli nie jest to możliwe, widzę kilka opcji, ale każdy ma swoje wady:
- Przejście każdej funkcji do własnego modułu więc mogę przenieść drogie powiązania z przestrzenią nazw modułu najwyższego poziomu bez obawy o inne funkcje uzyskujące dostęp do nich. Ponieważ spodziewam się, że będzie wiele takich funkcji, liczba modułów eksploduje (setki w dużym projekcie). I nie jestem fanem tylko jednej funkcji na moduł religii, tak jak jest on głoszony w społeczności node.js.
- Przenieś wiązania do przestrzeni nazw modułu najwyższego poziomu i nadaj każdej z nich wystarczająco unikatową nazwę, aby uniknąć konfliktów i wyraźnie wyjaśnić, że są prywatne (np.
headerStyle
->header__headerStyle
). - Użyj
TemplateHaskell
, aby odciążyć kosztowne obliczenia do kompilacji.
Dlaczego po prostu nie wykonywać funkcji na najwyższym poziomie, ale nie eksportować jej z modułu? – user2297560
@ user2297560 Wyjaśniłem, dlaczego chcę tego uniknąć. – wereHamster
To nie dzieje się automatycznie? –