2011-07-14 14 views

cevap

37

: Integral ait

Prelude> let x = 5::Int 
Prelude> sqrt (fromIntegral x) 
2.23606797749979 

hem Int ve Integer olduğu durumlar:

  • fromIntegral :: (Integral a, Num b) => a -> b alır senin Int (Integral örneğidir olan) ve "kılan" bir Num.

  • sqrt :: (Floating a) => a -> a bir Floating ve Num devraldığı Fractional dan Floating kaynaklanan devralma, beklediğini, bu yüzden sınıfları Haskell Wikibook içinde diagram oldukça yararlı olduğunu düşünüyorum fromIntegral

güvenle sqrt için sonucunu geçebilir bu durumlarda.

+1

Could 'sqrt (fromIntegral x)' sqrt $ fromIntegral x' olarak da yazılabilir mi? – rzetterberg

+0

Açık uygulama ($) örtülü uygulama olarak sıkı bir şekilde bağlanmadığından, gerçekten de olabilir. – Edward

+0

evet! ve ayrıca (sqrt fromIntegral) x' – MarcoS

10

Unutmayın, uygulama diğer herhangi bir operatörden daha sıkı bağlanır. Bu kompozisyon içerir. örtük uygulama (boşluk) daha sıkı açık uygulama ($) daha bağlar çünkü ne istediğiniz, Sonra

fromIntegral x 

ilk değerlendirilecektir

sqrt $ fromIntegral x 

olduğunu. Eğer kompozisyon nasıl çalışacağını görmek istiyorsanız

Alternatif:

(sqrt . fromIntegral) x 

Parantez kompozisyon operatör ilk değerlendirilir ve daha sonra ortaya çıkan fonksiyon uygulamanın sol tarafı olduğundan emin olun.

33

Belki de sonucun Int olmasını mı istiyorsunuz?

isqrt :: Int -> Int 
isqrt = floor . sqrt . fromIntegral 

Sen ceiling veya round ile floor değiştirmek isteyebilir. (BTW, bu işlevin verdiğimden daha genel bir türü vardır.)

+1

ghc bu konuda uyarır, çünkü 'fromIntegral' ile 'floor' arasında hangi tipin kullanılacağını bilmez (“Double”, “Float” vb.). Düzeltmek için: 'isqrt x = kat.sqrt $ (fromIntegral x :: Float), hangisi daha az zarif :( –

+0

Yine de hoşuma gidiyor. –

İlgili konular