2010-07-18 18 views
25

Haskell'de iki Int değerini bölmek ve sonucu bir Float olarak elde etmek istiyorum.Bir Float elde etmek için iki Int değerini bölmenin doğru yolu nedir?

foo :: Int -> Int -> Float 
foo a b = fromRational $ a % b 

ama GHC (sürüm 6.12.1) bana "beklenen ulaşamasa türü türetilmiş tip karşı 'Integer' 'Int'" ifadesinde a ilgili söyler: Böyle yapıyor çalıştı. fromRational çağrı bir Ratio Integer üretmek için (%) gerektirir, bu nedenle işlenen de tip Integer yerine Int olması gerekir:

nedenini anlıyorum. Ama bölündüğüm değerler, Int aralık sınırının yakınında değil, bu nedenle keyfi hassas bignum türü kullanmak fazlalık gibi görünüyor.

Bunu yapmanın doğru yolu nedir? İşlenenlerime toInteger numaralı telefonu aramalı mıyım yoksa bilmediğim daha iyi bir yaklaşım var mı ((%) ve oranlarını içermiyor olabilir)?

cevap

32

Önce işlenenleri numaralı floatlara dönüştürmeli ve bölmelisiniz, aksi takdirde tamsayı bölümü (ondalık basamak içermez) gerçekleştireceksiniz.

Laconic çözelti

foo :: Int -> Int -> Float 
+0

Teşekkür ile

foo a b = (fromIntegral a)/(fromIntegral b) 

kısaltmasıdır

foo = (/) 'on' fromIntegral 

, mantıklı (Data.Function gerektirir). İlk önce Float'a dönüp dönemeyeceğimi merak ettim, fakat bir şekilde çeşitli sayısal sınıflardaki tüm işlevler için dokümanlar arasında dolaşırken bir yandan 'ViewLife' dosyasını gözden kaçırmayı başardım. (Diğer yaklaşımın, aldığınız gibi ondalık basamakları yitirirken tamsayı bölüşümü yapmasını sanmıyorum, yine de: Tamlığı kaybetmeyen tam sayılardan bir "Rational" yapıyordum.) – Wyzard

+0

@Wyzard: Tamsayılardan bir Rasyonel yapmamak. Operatörün * sonucunu aslında bir Rational olarak görüyorsunuz, aslında değil. 'FromRational' için tür imzasına bakın: argüman bir Rasyonel iken, Ratio Int' ve 'Ratio Integer' her ikisi de farklı tiplerdir. ToRational'ı amaçlamış olabilirsiniz. – Chuck

+0

@Chuck: "Rational", "Oran Tamsayı" için bir takma addır ve "(%)", işlenenlerinin ne türden bir "Oran" değerini döndürür, bu yüzden onu iki "Tamsayı" 'ya uygulamak bir "Rasyonel" (Ben yanlış anladım). Benim problemim ona “Int” vermekti ve “Ratio Int” (aslında * bir "Rational" değil) üretiyordu. – Wyzard

İlgili konular