Saya mencoba mendefinisikan fungsi sederhana apa pun yang membentang beberapa baris dalam ghci, ambil yang berikut sebagai contoh:
let abs n | n >= 0 = n
| otherwise = -n
Sejauh ini saya sudah mencoba menekan Enter setelah baris pertama:
Prelude> let abs n | n >= 0 = n
Prelude> | otherwise = -n
<interactive>:1:0: parse error on input `|'
Saya juga telah mencoba untuk menggunakan :{
dan :}
perintah tetapi saya tidak sampai jauh:
Prelude> :{
unknown command ':{'
use :? for help.
Saya menggunakan GHC Interactive versi 6.6 untuk Haskell 98 di Linux, apa yang saya lewatkan?
:{
,:}
.Jawaban:
Untuk penjaga (seperti contoh Anda), Anda bisa meletakkan semuanya di satu baris dan berfungsi (penjaga tidak peduli dengan jarak)
Jika Anda ingin menulis fungsi Anda dengan beberapa definisi yang cocok dengan pola pada argumen, seperti ini:
Kemudian Anda akan menggunakan kawat gigi dengan tanda koma yang memisahkan definisi
sumber
GHCi sekarang memiliki mode input multiline, diaktifkan dengan: set + m. Sebagai contoh,
sumber
ghci
berperilaku seperti interpreter Python dalam hal ini. Sangat mudah! Anda sebenarnya bisa membuat.ghci
file di direktori home Anda di mana Anda meletakkan:set +m
dan mode multiline akan menjadi default setiap kali Anda memulaighci
!:set prompt "λ "
garis yang terus-menerus mengatakanPrelude
bukanλ
. Ada cara untuk menyiasatinya?let
. Cukup ketik alet
diikuti oleh baris baru:let
⏎. Lalufac 0 = 1
⏎. Lalufac n = n * fac (n-1)
⏎ ⏎ dan kamu selesai!Dan benar, tetapi
:{
dan:}
masing-masing harus muncul di baris mereka sendiri:Ini juga berinteraksi dengan aturan tata letak, jadi ketika menggunakan notasi mungkin lebih mudah untuk menggunakan kawat gigi dan semi-titik dua secara eksplisit. Misalnya, definisi ini gagal:
Tapi itu berfungsi ketika kawat gigi dan semi-titik dua ditambahkan:
Ini hanya akan sangat berarti ketika menempelkan definisi dari file, di mana indentasi dapat berubah.
sumber
Sepertinya
:{
dan:}
merupakan fitur yang cukup baru. Anda mungkin perlu meningkatkan GHC.Edit: dikonfirmasi, lihat http://www.haskell.org/ghc/docs/6.8.2/html/users_guide/release-6-8-2.html
sumber
Jika Anda tidak ingin meningkatkan GHC hanya untuk
:{
dan:}
, Anda harus menulis semuanya dalam satu baris:Saya tidak mengetahui adanya definisi tunggal dalam Haskell yang harus ditulis pada banyak baris. Hal di atas memang bekerja di GHCi:
Untuk ekspresi lain, seperti
do
blok, Anda harus menggunakan sintaks non-tata letak dengan kurung kurawal dan titik koma (eugh).sumber
Saya menggunakan GHCi, versi 8.2.1 di macOS Catalina 10.15.2. Berikut ini adalah bagaimana saya menempatkan kedua deklarasi tipe fungsi dan penjaga. Perhatikan bilah vertikal di sebelah kiri adalah untuk beberapa baris GHCi.
sumber
:{
dan:}
Anda tidak perlu menentukanlet
sebelum deklarasi tipe Anda, artinya Anda tidak perlu membuat indentasi baris kedua dan selanjutnya.Sepertinya menyisipkan kedua baris sekaligus atau menggunakan control-enter untuk setiap baris baru menyimpan semuanya, setidaknya di https://repl.it/languages/haskell . Anda akan melihat 2 titik di awal baris kedua. Atau letakkan di file dan: muat file (: l main). Kenapa perut tidak bekerja dengan angka negatif? Oh, Anda harus meletakkan tanda kurung di sekitar nomor itu.
sumber