Ghci'de, yazdığımda
:t (-)
türünü anlamak (-)için geri döner
(-) :: Num a => a -> a -> a
Ancak, -1haskell yazdığımda , bu (-)tür olduğunu ima eden bir sayı döndürür Num a => a -> a. (-)Görünüşte iki farklı tip nasıl olabilir ?
Ghci'de, yazdığımda
:t (-)
türünü anlamak (-)için geri döner
(-) :: Num a => a -> a -> a
Ancak, -1haskell yazdığımda , bu (-)tür olduğunu ima eden bir sayı döndürür Num a => a -> a. (-)Görünüşte iki farklı tip nasıl olabilir ?
Yanıtlar:
Bu, dilde bir tasarım kararıdır. -1bir sayıdır, ancak bu bağlamda kullanımı işlevle ilgili değildir(-) . (Ackdari'nin yanıtlarında belirttiği gibi, bu kullanım işlevle ilgilidir negate.) Bunun çalışmasına izin veren birkaç uzlaşma var:
(-)Operatörün doğru dilimini alamazsınız . Çözüm olarak Haskell subtractişlevi sağlar.
Ödevin başında değilse (örn. Doğrudan =veya sonrasında ->) , parantez olmadan negatif bir tam sayı yazamazsınız . Bu bir ayrıştırma hatası oluşturur:
let x = 8 * -1
Bunun yerine şu şekilde yazılmalıdır:
let x = 8 * (-1)
Ancak, bu iyi:
let x = -1 * 8Bunlar, dilin tasarımcıları için makul ödünleşmeler olarak kabul edildi.
Unary eksi Haskell'de özeldir. Raporun 3.4 bölümünde belirtildiği gibi :
Özel form , Haskell'deki tek önek operatörü olan önek negatifini belirtir ve sözdizimidir . İkili operatör mutlaka Prelude'un tanımına atıfta bulunmaz ; modül sistemi tarafından geri tepebilir. Ancak, unary her zaman Prelude'ta tanımlanan işleve atıfta bulunacaktır . Operatörün yerel anlamı ile tek taraflı olumsuzlama arasında bir bağlantı yoktur .
-enegate (e)---negate-