Int
'dan sqrt
'u nasıl edinebilirim.Haskell'deki Int'den sqrt alın
Öyle deneyin:
sqrt . fromInteger x
Ama tipleri uyumluluk hatası alıyorum. fromIntegral
kullanma
Int
'dan sqrt
'u nasıl edinebilirim.Haskell'deki Int'den sqrt alın
Öyle deneyin:
sqrt . fromInteger x
Ama tipleri uyumluluk hatası alıyorum. fromIntegral
kullanma
: 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.
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.
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.)
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 :( –
Yine de hoşuma gidiyor. –
Could 'sqrt (fromIntegral x)' sqrt $ fromIntegral x' olarak da yazılabilir mi? – rzetterberg
Açık uygulama ($) örtülü uygulama olarak sıkı bir şekilde bağlanmadığından, gerçekten de olabilir. – Edward
evet! ve ayrıca (sqrt fromIntegral) x' – MarcoS