W module System.Info
widzę te funkcje:
os :: String
arch :: String
compilerName :: String
compilerVersion :: Version
Dlaczego tam nie IO
ma? Uzyskują dostęp do systemu ... Czy się mylę? Moje oczekiwania były jak:
os :: IO String
arch :: IO String
compilerName :: IO String
compilerVersion :: IO Version
Przypadek użycia:
print os -- "darwin"
print arch -- "x86_64"
print compilerName -- "ghc"
IO
tam być,uname(3)
na Hackage jest dostępne opakowanie: hackage.haskell.org/package/bindings-unamePytanie jest dobre. Odpowiedź jest taka, że takie wartości są statyczne na kompilację programu. Zasadniczo są one wkompilowane w program i nigdy potem się nie zmieniają. W związku z tym nic (w założeniach, których używa GHC) nie ulega awarii, jeśli traktuje się je jako stałe. I wygodniej jest użyć prostej stałej niż akcji IO.
Ale to wszelkiego rodzaju starsze rozumowanie. Haskell to stary język. (Nie, tak naprawdę, jest starszy od Java o kilka lat.) Wiele bibliotek zostało zbudowanych z rozumowaniem, które nie jest już uważane za najlepsze praktyki. To są tego przykłady. Nowoczesna biblioteka odsłaniająca je prawdopodobnie sprawiłaby, że stałyby się operacjami IO, nawet jeśli wyniki nie ulegną zmianie po kompilacji. Bardziej przydatne jest umieszczanie rzeczy, które nie są stałymi na poziomie źródłowym, za działaniami We / Wy, chociaż wciąż istnieją pewne znaczące wyjątki, takie jak
Int
zmiana rozmiaru między platformami 32- i 64-bitowymi.W każdym razie ... Powiedziałbym, że twoje oczekiwania są solidne, a te typy są wynikiem historycznych osobliwości.
źródło
EDYCJA: Podziękowania dla @interjay i @Antal Spector-Zabusky za wyjaśnienie, dlaczego ta odpowiedź jest odrzucana. Oni napisali
Obecnie ma dwa głosy usuwania. Pozwolę, aby proces ten przebiegał prawidłowo, ale sugeruję, że ma on pewną wartość. Na marginesie, ich wyjaśnienia pokazują, że pytanie było słabe, podobnie jak odpowiedzi, ponieważ nowicjusz z Haskell mógł łatwo podążać za moim rozumowaniem.
Oryginalna odpowiedź:
Nie jestem programistą Haskell, ale dwie już podane odpowiedzi nie pasują do dokumentacji, którą PO powiązał.
Moja interpretacja dokumentacji jest następująca.
os :: String
- To daje „System operacyjny, na którym działa program”.Oczekuję, że spowoduje to wywołanie systemowe w celu uzyskania informacji. Ponieważ system, na którym kompilowany jest program, może różnić się od tego, na którym działa, nie może być wartością wstawioną przez kompilator. Jeśli kod jest interpretowany, interpreter może dostarczyć wynik, który należy uzyskać za pomocą wywołania systemowego.
arch :: String
- To daje „Architekturę maszyny, na której program działa”.Ponownie spodziewam się, że spowoduje to wywołanie systemowe w celu uzyskania informacji. Ponieważ system, na którym kompilowany jest program, może różnić się od tego, na którym działa, nie może być wartością wstawioną przez kompilator.
compilerName :: String
- To daje „implementację Haskell, z którą program został skompilowany lub jest interpretowany”.Ta wartość jest z pewnością wstawiana przez kompilator / interpreter.
compilerVersion :: String
- To daje „wersjęcompilerName
z którą program został skompilowany lub jest interpretowany”.Ta wartość jest z pewnością wstawiana przez kompilator / interpreter.
Chociaż można wziąć pod uwagę, że pierwsze dwa wywołanie uzyskuje dane wejściowe, wynik pochodzi z wartości przechowywanych przez system operacyjny. I / O ogólnie odnosi się do dodatkowego dostępu do pamięci.
źródło
IO
monady do emulacji stanu, emulacji sekwencji operacjios :: String
podczas oceny wywoływał system.os
iarch
są uzyskiwane w czasie wykonywania.