EDYCJA: Podziękowania dla @interjay i @Antal Spector-Zabusky za wyjaśnienie, dlaczego ta odpowiedź jest odrzucana. Oni napisali
Dokumentacja jest nieco myląca. Wartości są zakodowane na stałe w kompilatorze GHC. Po 48 latach z pewnością wiesz, że rzeczywisty kod zawsze przebija dokumentację. - interjay wczoraj @ andy256 Masz całkowitą rację, że dokumentacja jest zła (w rzeczy samej, właśnie dlatego Francisco zadał to pytanie), a twoje zamieszanie jest zrozumiałe. Haskell polega na tym, że jeśli wartości String mogą się zmieniać w czasie wykonywania, byłby to poważny błąd - zmienne nie mogą się zmieniać. Takie jest znaczenie konstruktora typu IO - reprezentuje on obliczenia, które mają dostęp do „świata zewnętrznego”, a więc taki, którego wynik może ulec zmianie. Wywołanie systemowe jest dobrym przykładem działania we / wy. … [1/2] - Antal Spector-Zabusky 9 godzin temu @ andy256… (Kolejnym działaniem IO może być „aktualizacja globalnego licznika”.) Kiedy więc widzimy String, wiemy, że nie może on komunikować się z system operacyjny pod maską. To dlatego, być może zaskakujące, jeśli nie jesteś przyzwyczajony do Haskell, nie byłoby łatwo wdrożyć os :: String do wywołania systemowego - żadnej takiej wartości nie da się wprowadzić w podstawowym Haskell, naruszyłby oczekiwania każdego programisty co do tego, jak programy pracować, a nawet potknąć się o kompilator i optymalizator (nie jest to kwestia teoretyczna - istnieją odpowiedzi przepełnienia stosu, w których ludzie napotykają analogiczne problemy). [2/2] - Antal Spector-Zabusky To dlatego, być może zaskakujące, jeśli nie jesteś przyzwyczajony do Haskell, nie byłoby łatwo wdrożyć os :: String do wywołania systemowego - żadnej takiej wartości nie da się wprowadzić w podstawowym Haskell, naruszyłby oczekiwania każdego programisty co do tego, jak programy pracować, a nawet potknąć się o kompilator i optymalizator (nie jest to kwestia teoretyczna - istnieją odpowiedzi przepełnienia stosu, w których ludzie napotykają analogiczne problemy). [2/2] - Antal Spector-Zabusky To dlatego, być może zaskakujące, jeśli nie jesteś przyzwyczajony do Haskell, nie byłoby łatwo wdrożyć os :: String do wywołania systemowego - żadnej takiej wartości nie da się wprowadzić w podstawowym Haskell, naruszyłby oczekiwania każdego programisty co do tego, jak programy pracować, a nawet potknąć się o kompilator i optymalizator (nie jest to kwestia teoretyczna - istnieją odpowiedzi przepełnienia stosu, w których ludzie napotykają analogiczne problemy). [2/2] - Antal Spector-Zabusky i potencjalnie nawet wyzwolić kompilator i optymalizator (nie jest to kwestia teoretyczna - istnieją odpowiedzi przepełnienia stosu, w których ludzie napotykają analogiczne problemy). [2/2] - Antal Spector-Zabusky i potencjalnie nawet wyzwolić kompilator i optymalizator (nie jest to kwestia teoretyczna - istnieją odpowiedzi przepełnienia stosu, w których ludzie napotykają analogiczne problemy). [2/2] - Antal Spector-Zabusky
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.
IO
tam być,uname(3)
na Hackage jest dostępne opakowanie: hackage.haskell.org/package/bindings-uname