8

Rational一部の値を 10 進展開で表示したい。つまり、 を表示する代わりに、 を3 % 4表示します0.75。この関数をタイプにしたいと思いInt -> Rational -> Stringます。1 つ目は、展開が終了しない可能性があるIntため、小数点以下の最大桁数を指定することです。Rational

HoogleData.Ratio のハドックは役に立ちませんでした。この機能はどこにありますか?

4

5 に答える 5

9

うまくいくよ。エレガントではありませんが、仕事はします:

import Numeric
import Data.Ratio

display :: Int -> Rational -> String
display n x = (showFFloat (Just n) $ fromRat x) ""
于 2015-06-19T07:01:00.540 に答える
7

ライブラリ コードを再利用する任意精度バージョン:

import Data.Number.CReal

display :: Int -> Rational -> String
display digits num = showCReal digits (fromRational num)

以前、有理数を検査しやすい方法で数字に変換する関数を見たことがあることは知っています (つまり、数字が繰り返される場所が明確になります) が、今は見つけられないようです。いずれにせよ、それが必要であることが判明した場合、書くのは難しくありません。通常の長除算アルゴリズムをコード化し、既に行った除算を監視するだけです。

于 2015-06-19T17:18:51.403 に答える
2
import Data.List as L
import Data.Ratio

display :: (Integral i, Show i) => Int -> Ratio i -> String
display len rat = (if num < 0 then "-" else "") ++ show ip ++ "." ++ L.take len (go (abs num - ip * den))
  where
    num = numerator rat
    den = denominator rat
    ip  = abs num `quot` den

    go 0 = ""
    go x = shows d (go next)
      where
        (d, next) = (10 * x) `quotRem` den
于 2016-11-19T15:35:04.110 に答える