1
floor
は、RealFrac
typeclassについてのみ定義されています。私はこのtypeclassについてよく知らないし、残りのコードは浮動小数点数しか使わない。ハスケルの浮動小数点数のためにfloorとfractを実装する最良の方法は? Haskellの
Float
をInt
にキャストする機能が見つかりません。あった場合、floor
はfromIntegral (fromFloating x)
とfract
に相当します
fract x = x - floor x
として定義されるだろう、私が言ったようにしかし、私はfromFloating
が何をしたいかのように何もしないすべての機能を発見していません。
fract x
| x < 0 = 1 - fract (abs x)
| x < 1 = x
| otherwise = fract (x - 1)
、その後、もちろんfloor x
のx - fract x
次のようになります。これは、私がfract
を実装するための考えることができる唯一の方法です。しかし、上のアルゴリズムはO(n)であり、物事を大幅に遅くすることになるので、一定の時間でこれを行う方法があることを期待しています。
'floor'機能は以下の型'階::(RealFrac、インテグラルB)=>を持つA - > B'、あなたができるので、 'Float'をインスタンス化して' Int'を返します(https://www.haskell.org/hoogle/?hoogle=floor) – Euge
特に、FloatとDoubleの両方がRealFracのインスタンスなので、あなたの懸念事項RealFracを使用する代わりにそれらを置き忘れてしまいます。 – amalloy
どうして 'fract = snd。 properFraction'? ( 'fract = \ x - > x - fromIntegral(floor x)'は正しい型を持ち、あなたが望むものとほとんど同じですが、負の数では機能しません)。 'Float'を' Int'に 'キャストする 'ことはまったく必要ありません(キャストは実際にあなたに意味します)。 – user2407038