Pertanyaan Bagaimana cara menulis deklarasi tipe fungsi Haskell tanpa argumen?


Bagaimana cara menulis deklarasi tipe fungsi haskell tanpa argumen?


15
2018-01-08 22:26


asal


Jawaban:


Tidak ada yang namanya fungsi tanpa argumen, itu hanya sebuah nilai. Tentu, Anda dapat menulis pernyataan seperti itu:

five :: Int
five = 5

Mungkin terlihat lebih seperti apa yang Anda minta jika saya membuatnya

five' :: () -> Int
five' () = 5

tapi itu benar-benar setara (kecuali Anda menulis sesuatu yang konyol seperti itu five' undefined) dan superfluen1.

Jika yang Anda maksud adalah sesuatu seperti, di C

void scream() {
  printf("Aaaah!\n");
}

maka itu lagi bukan fungsi melainkan tindakan. (Pemrogram C memang menyebutnya fungsi, tetapi Anda sebaiknya mengatakannya prosedur, semua orang akan mengerti.) Apa yang saya katakan di atas memegang cukup banyak dengan cara yang sama, Anda akan gunakan

scream :: IO()
scream = putStrLn "Aaaah!"

Perhatikan bahwa kosong () lakukan dalam hal ini tidak ada hubungannya dengan tidak memiliki argumen (yang mengikuti sudah dari tidak adanya -> panah), sebaliknya itu berarti juga tidak ada mengembalikan nilai, itu hanya tindakan "efek samping saja".


1Sebenarnya, itu berbeda dalam satu cara yang relevan: five adalah bentuk aplikatif konstan, yang berarti itu dimafikan. Jika saya telah mendefinisikan seperti konstan dalam beberapa cara bundaran (misalnya sum $ 5 : replicate 1000000 0) maka perhitungan panjang akan dilakukan hanya sekali, bahkan jika five dievaluasi beberapa kali selama menjalankan program. OTOH, di mana pun Anda akan menulis five' (), perhitungannya akan dilakukan lagi.


39
2018-01-08 22:35



Karena fungsi dalam Haskell murni (hasilnya hanya bergantung pada argumennya), fungsi yang setara tanpa argumen hanyalah sebuah nilai. Sebagai contoh, one = 1.


9
2018-01-08 22:34