Dalam modul System.Info
saya melihat fungsi-fungsi ini:
os :: String
arch :: String
compilerName :: String
compilerVersion :: Version
Mengapa tidak IO
ada? Mereka mengakses sistem ... Apakah saya salah? Harapan saya adalah sesuatu seperti:
os :: IO String
arch :: IO String
compilerName :: IO String
compilerVersion :: IO Version
Gunakan kasus:
print os -- "darwin"
print arch -- "x86_64"
print compilerName -- "ghc"
IO
di sana, ada pembungkusuname(3)
tersedia di Hackage: hackage.haskell.org/package/bindings-unamePertanyaannya bagus. Jawabannya, seperti itu, adalah bahwa nilai-nilai itu statis per kompilasi program. Mereka pada dasarnya dikompilasi ke dalam program, dan tidak pernah berubah setelah itu. Dengan demikian, tidak ada (dalam asumsi yang digunakan GHC) rusak jika Anda memperlakukannya sebagai konstanta. Dan lebih mudah menggunakan konstanta sederhana daripada aksi IO.
Tapi itu semua semacam alasan warisan. Haskell adalah bahasa kuno. (Tidak juga, ini lebih tua dari Jawa beberapa tahun). Banyak perpustakaan telah dibangun dengan alasan yang tidak lagi dianggap praktik terbaik. Ini adalah contohnya. Sebuah perpustakaan modern yang mengeksposnya mungkin akan membuat mereka bertindak IO meskipun hasilnya tidak berubah setelah kompilasi. Lebih berguna untuk meletakkan hal-hal yang bukan konstanta di tingkat sumber di belakang tindakan IO, meskipun masih ada beberapa pengecualian penting, seperti
Int
mengubah ukuran antara platform 32-dan 64-bit.Dalam hal apapun ... Saya akan mengatakan harapan Anda solid, dan tipe-tipe itu adalah hasil dari keanehan sejarah.
sumber
EDIT: Terima kasih kepada @interjay dan @Antal Spector-Zabusky karena telah menjelaskan mengapa jawaban ini diturunkan. Mereka menulis
Saat ini memiliki dua penghapusan suara. Saya akan membiarkan proses itu mengambil jalannya saja, tetapi menyarankan itu sebenarnya memiliki beberapa nilai. Di samping catatan, penjelasan mereka menunjukkan bahwa pertanyaan itu lemah, dan begitu pula jawabannya, karena seorang pemula Haskell dapat dengan mudah mengikuti alasan yang saya lakukan.
Jawaban asli:
Saya bukan programmer Haskell, tetapi dua jawaban yang sudah diberikan tidak cocok dengan dokumentasi yang ditautkan oleh OP.
Interpretasi saya terhadap dokumentasi berikut.
os :: String
- Ini memberi Anda "Sistem operasi tempat program berjalan."Saya berharap ini akan mengeluarkan panggilan sistem untuk mendapatkan informasi. Karena sistem, program yang dikompilasi mungkin berbeda dengan yang dijalankannya tidak dapat berupa nilai yang dimasukkan oleh kompiler. Jika kode ditafsirkan maka penerjemah dapat memberikan hasil, yang harus diperoleh melalui panggilan sistem.
arch :: String
- Ini memberi Anda "Arsitektur mesin tempat program berjalan."Sekali lagi, saya berharap ini akan mengeluarkan panggilan sistem untuk mendapatkan informasi. Karena sistem, program yang dikompilasi mungkin berbeda dengan yang dijalankannya tidak dapat berupa nilai yang dimasukkan oleh kompiler.
compilerName :: String
- Ini memberi Anda "Implementasi Haskell dengan mana program ini disusun atau sedang ditafsirkan."Nilai ini tentu saja dimasukkan oleh kompiler / interpreter.
compilerVersion :: String
- Ini memberi Anda "VersicompilerName
program yang dikompilasi atau sedang ditafsirkan."Nilai ini tentu saja dimasukkan oleh kompiler / interpreter.
Meskipun Anda dapat mempertimbangkan dua panggilan pertama untuk mendapatkan input, hasilnya berasal dari nilai yang dipegang oleh Sistem Operasi. I / O umumnya mengacu pada akses penyimpanan sekunder.
sumber
IO
monad untuk meniru negara, meniru urutan operasios :: String
sehingga melakukan panggilan sistem saat dievaluasi.os
danarch
diperoleh saat runtime.