Bagaimana mungkin (-) memiliki dua tipe yang berbeda?


12

Dalam ghci, saat saya mengetik

:t (-)

untuk mengetahui jenisnya (-), ia kembali

(-) :: Num a => a -> a -> a

Namun, ketika saya menulis -1haskell mengembalikan angka, yang sepertinya menyiratkan bahwa (-)adalah tipe Num a => a -> a. Bagaimana bisa (-)ada dua tipe yang berbeda?

Jawaban:


15

Ini adalah keputusan desain dalam bahasa tersebut. -1adalah angka, tetapi penggunaannya dalam konteks ini tidak terkait dengan fungsi(-) . (Seperti yang Ackdari sebutkan dalam jawaban mereka, penggunaan ini terkait dengan fungsi negate.) Ada beberapa kompromi yang memungkinkan ini berfungsi:

  1. Anda tidak dapat mengambil irisan yang tepat dari (-)operator. Sebagai solusinya, Haskell menyediakan subtractfungsi.

  2. Anda tidak dapat menulis bilangan bulat negatif tanpa tanda kurung kecuali di awal penugasan (misalnya langsung setelah =atau ->). Ini menghasilkan kesalahan parse:

    let x = 8 * -1

    Sebaliknya, harus ditulis sebagai

    let x = 8 * (-1)

    Namun, ini tidak masalah:

    let x = -1 * 8

Ini dianggap sebagai pengorbanan yang masuk akal bagi para desainer bahasa.


8

Jawabannya sudah dijelaskan dalam haskell-wiki , katanya

Minus unary adalah gula sintaksis untuk fungsi Prelude negate

jadi fungsinya (-)selalu a - bberfungsi dan jika Anda menulis kode seperti let x = -ykompiler akan menerjemahkannya let x = negate y.


7

Minus Unary khusus di Haskell. Sebagaimana dinyatakan dalam bagian 3.4 dari Laporan :

Bentuk khusus menunjukkan negasi awalan, satu-satunya operator awalan di Haskell, dan sintaksis untuk . Operator biner tidak perlu merujuk pada definisi dalam Pendahuluan; itu mungkin pulih oleh sistem modul. Namun, unary akan selalu merujuk ke fungsi yang ditentukan dalam Pendahuluan. Tidak ada hubungan antara makna lokal operator dan negasi unary.-enegate (e)---negate-


2
Jawaban satu kalimat tidak disarankan pada SO, begitu juga tautan tanpa ringkasan kontennya, karena dapat rusak.
Andrew Ray

Seperti yang dapat saya asumsikan bahwa tautan ke laporan / standar juga sangat pesimis dibandingkan dengan video wiki / tutorial / youtube?
bipll

@bipll Ya. Masalah dengan jawaban hanya tautan bukanlah kualitas target tautan, melainkan risiko pembusukan tautan. Jika Anda menyalin di bagian laporan yang relevan, maka jawaban Anda akan baik-baik saja.
Joseph Sible-Reinstate Monica
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.