Często potrzebuję wykonać funkcję rdzeniową, która jest używana w wielu miejscach w jakiś sposób konfigurowalny - tzn. Może używać algorytmu A lub algorytmu B w zależności od przełącznika wiersza poleceń; lub jeśli jest on w stanie wydrukować bardzo szczegółowe informacje na standardowe wyjście, jeśli jakaś flaga "debugowania" jest ustawiona.Właściwy sposób traktowania globalnych flag w Haskell
Jak należy wdrożyć takie globalne flagi?
Widzę 4 opcje, wszystkie nie są naprawdę dobre.
1) Odczytaj argumenty wiersza poleceń od funkcji - bad, ponieważ wymaga to monady IO, a funkcje obliczeń rdzeniowych są czyste, nie chcę uzyskać IO;
2) Przepuścić parametr od strony głównej/IO do funkcji "liścia", która musi zmienić zachowanie - całkowicie bezużyteczny, ponieważ oznacza to zmianę kilkunastu niepowiązanych funkcji w różnych modułach w celu przekazania tego parametru, oraz Chcę wypróbować takie opcje konfiguracji wiele razy bez zmiany kodu zawijania za każdym razem;
3) Użyj unsafePerformIO, aby uzyskać prawdziwą zmienną globalną - czuje się brzydki i przesadny w przypadku tak prostego problemu;
4) W samym środku funkcji znajduje się kod dla obu opcji i komentarz jednego z nich. Albo funkcje do_stuff_A i do_stuff_B, i zmień, który z nich jest wywoływany w zależności od tego, co mówi funkcja globalna "needDebugInfo = True". Właśnie to robię teraz dla debuginfo, ale nie można go zmienić bez rekompilacji i nie powinien to być najlepszy dostępny sposób ...
Nie potrzebuję globalnej zmienności state - chcę mieć prostą globalną flagę, która jest niezmienna w czasie wykonywania, ale może być w jakiś sposób ustawiona podczas uruchamiania programu. Czy są jakieś opcje?