0

doubleや、乗算と加算をサポートする他の種類の数値を操作して、結果としてdoubleを生成する関数を作成したいと思います。もちろん、(*)のタイプはt-> t-> tであるため、以下はコンパイルされません。したがって、異なるタイプを混在させることはできません。

f :: (Num a) => Double -> a -> a -> Double
f x a b = a*x + b

私が欲しいのは、次のようなものを書く能力です。

f :: ...
f x a b = ... -- equivalent to a*x + b

f 1.0 (2 :: Int)    (3 :: Int)    -- returns 5.0
f 1.0 (2 :: Word32) (3 :: Word32) -- returns 5.0
f 1.0 (2 :: Float)  (3 :: Float)  -- returns 5.0

それを機能させるにはどうすればよいですか?それとも私は根本的に間違っていて、これを行うべきではありませんか?とても不思議ですが、インターネット上でこれについて何も見つかりませんでした。

4

2 に答える 2

3

RWH.chapter6には、いくつかの数値タイプ間で数値を変換することについてのすばらしい段落があります表6.4)

f :: (Real a) => Double -> a -> a -> Double
f x a b = x * (cast a) + (cast b)
  where cast = fromRational . toRational

実行可能のようです。

> f 1.0 (2 :: Int)    (3 :: Int)
5.0
it :: Double
> f 1.0 (2 :: Word32) (3 :: Word32)
5.0
it :: Double
> f 1.0 (2 :: Float)  (3 :: Float)
5.0
it :: Double
于 2012-04-22T11:27:17.950 に答える
1

「オーバーロード」のための型クラスのメカニズムの使用:

import Data.Word
import GHC.Float

class F a where f :: Double -> a -> a -> Double
instance F Int where f x a b = fromIntegral a * x + fromIntegral b
instance F Word32 where f x a b = fromIntegral a * x + fromIntegral b
instance F Float where f x a b = float2Double a * x + float2Double b

tests =
  [ f 1.0 (2 :: Int) (3 :: Int)
  , f 1.0 (2 :: Word32) (3 :: Word32)
  , f 1.0 (2 :: Float) (3 :: Float)
  ]
-- > tests
-- [5.0,5.0,5.0]
-- > :t it
-- it :: [Double]

http://www.haskell.org/haskellwiki/Converting_numbersも参照してください。

于 2012-04-22T11:51:38.397 に答える