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)?
Teşekkür ile
kısaltmasıdır
, 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@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
@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