SORU
19 HAZİRAN 2011, Pazar


Haskell içinde üs

Birisi Haskell Başlangıcı üs (yani ^ **) için iki ayrı işlevi tanımlar bana söyleyebilir mi? Tür sistemi çoğaltılması bu tür ortadan kaldırmak gerekiyordu.

Prelude> 2^2
4
Prelude> 4**0.5
2.0

CEVAP
19 HAZİRAN 2011, Pazar


Aslında üç üs operatörü vardır: (^), (^^) (**). ^ non-negatif üs, ^^ tamsayı üs ve ** kayan nokta ayrılmaz üs:

(^) :: (Num a, Integral b) => a -> b -> a
(^^) :: (Fractional a, Integral b) => a -> b -> a
(**) :: Floating a => a -> a -> a

Sebebi güvenlik türü: sayısal işlemleri sonuçları genellikle giriş bağımsız değişken(ler) olarak aynı tip. Ama kayan noktalı güç Int zam ve tipte Int elde edemezsiniz. Ve tür sistemi bunu engeller: (1::Int) ** 0.5 tür bir hata üretir. Aynı (1::Int) ^^ (-1) için de geçerli.

Başka bir şekilde koymak bu: Num tip kapalı altında ^ (değil gerekli bir çarpma ters), Fractional tip kapalı altında ^^, Floating tip kapalı altında **. Int Fractional örneği yok Hayır bu yana negatif bir güç büyütemezsin.

İdeal olarak, ^ ikinci değişkeni statik olarak negatif olmayan olmak kısıtlı (şu anda 1 ^ (-2) bir çalışma zamanı özel durum atar) olurdu. Ama Prelude doğal sayılar tipi yok.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • We've moved!

    We've moved!

    7 Ocak 2008
  • ThePhestor

    ThePhestor

    22 Mart 2011
  • TotalxLuna

    TotalxLuna

    27 Kasım 2011