Saya mengalami masalah dalam memasukkan perintah multi-line dalam ghci.
Kode 2-baris berikut ini berfungsi dari file:
addTwo :: Int -> Int -> Int
addTwo x y = x + y
Tetapi ketika saya masuk dalam ghci, saya mendapatkan kesalahan:
<interactive>:1:1: error:
Variable not in scope: addTwo :: Int -> Int -> Int
Saya juga mencoba memasukkan kode ke dalam :{ ... :}
, tetapi mereka juga tidak bekerja untuk contoh ini, karena ini hanya menambahkan baris menjadi satu baris, yang seharusnya tidak terjadi.
Saya menggunakan WinGHCi, versi 2011.2.0.1
Jawaban:
Sebagian besar waktu, Anda dapat mengandalkan inferensi tipe untuk mengerjakan tanda tangan untuk Anda. Dalam contoh Anda, berikut ini sudah cukup:
Jika Anda benar-benar menginginkan definisi dengan tanda tangan jenis, atau definisi Anda mencakup beberapa baris, Anda dapat melakukannya dalam ghci:
Perhatikan bahwa Anda juga dapat menekan ini ke satu baris:
Anda dapat mengetahui lebih lanjut tentang berinteraksi dengan ghci pada evaluasi Interaktif di bagian prompt dokumentasi.
sumber
let
memulai blok; entri dalam blok dikelompokkan berdasarkan indentasi; dan karakter non-spasi putih pertama di blok menetapkan lekukan di mana mereka dikelompokkan. Karena karakter non-spasi pertama dalamlet
blok di atas adalaha
dariaddTwo
, semua baris dalam blok harus indentasi sedalam itua
.Selesaikan masalah ini dengan menyalakan GHCI dan mengetik
:set +m
:Ledakan.
Apa yang terjadi di sini (dan saya berbicara sebagian besar kepada Anda , orang mencari bantuan saat bekerja melalui Learn You A Haskell ) adalah bahwa GHCI adalah lingkungan interaktif tempat Anda mengubah ikatan nama fungsi dengan cepat. Anda harus membungkus definisi fungsi Anda dalam sebuah
let
blok, sehingga Haskell tahu bahwa Anda akan mendefinisikan sesuatu. Hal-:set +m
hal tersebut adalah singkatan untuk konstruksi:{
kode multiline:}
.Whitespace juga signifikan dalam blok, jadi Anda harus membuat indentasi definisi fungsi Anda setelah definisi tipe Anda dengan empat spasi untuk memperhitungkan empat ruang dalam
let
.sumber
echo ':set +m' >> ~/.ghci
untuk membuat pengaturan ini gigih.let
dengan sendirinya di baris pertama maka semua yang lain tidak perlu di-indentasi sama sekali. di mana spasi putih benar-benar diperhitungkan adalah tidak boleh ada spasi tambahan di baris Anda. trailing whitespace dianggap sebagai Enter ekstra dan memecah blok multi-line.Gunakan
let
:sumber
Pada GHCI versi 8.0.1 ,
let
tidak lagi diperlukan untuk mendefinisikan fungsi pada REPL.Jadi ini seharusnya bekerja dengan baik untuk Anda:
Jenis-inferensi Haskell menyediakan pengetikan umum yang juga berfungsi untuk mengapung:
Jika Anda harus memberikan pengetikan sendiri, sepertinya Anda harus menggunakan
let
kombinasi dengan input multiline (gunakan:set +m
untuk mengaktifkan input multiline di GHCI):Tetapi Anda akan mendapatkan kesalahan jika Anda mencoba untuk melewatkan sesuatu selain
Int
karena Anda mengetik non-polimorfik:sumber
Untuk memperluas jawaban Aaron Hall , dalam versi GHCi 8.4.4 setidaknya, Anda tidak perlu menggunakan
let
deklarasi ketik jika Anda menggunakan:{
:}
style. Ini berarti Anda tidak perlu khawatir tentang menambahkan lekukan 4-ruang pada setiap baris berikutnya untuk diperhitungkanlet
, membuat fungsi yang lebih lama lebih mudah untuk diketik, atau dalam banyak kasus, salin-tempel (karena sumber aslinya kemungkinan tidak akan memiliki indentasi yang benar):Memperbarui
Sebagai alternatif, Anda dapat mengaktifkan mode input multi-garis
:set +m
, lalu mengetiklet
sendiri, tekan Enter, lalu tempel definisi tanpa lekukan yang diperlukan.Namun ini sepertinya tidak berfungsi dengan beberapa blok kode, seperti:
Namun
:{
,:}
tekniknya memang demikian.sumber
:{
, lalu pada baris berikutnyalet
dengan sendirinya, lalu tempel definisi Anda tanpa lekukan tambahan apa pun, lalu tutup:}
. :) dan dengan set mode input multi-line (:set +m
) Anda bahkan tidak memerlukan perintah kawat gigi selama tidak ada spasi tambahan pada baris kode.:set +m
Anda hanya dapat menggunakanlet
jalurnya sendiri? Jadi Anda bisa - itu keren. Terima kasih.let
maka baris baru tidak berfungsi. Lihat hasil edit saya.