2012-04-22 3 views
0

이중 및 기타 곱하기 및 더하기를 지원하는 다른 유형의 숫자로 작동하는 함수를 작성하여 결과로 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 

작동하려면 어떻게해야합니까? 아니면 근본적으로 잘못되어이 일을해서는 안됩니다. 그것은 매우 이상하지만 인터넷에 대해서는 이것에 대해 아무것도 발견하지 못했습니다.

+2

'f 1.0 ((2 : +3) :: Complex Double) ((7 : +4) :: Complex Double) - 결과는 –

+0

입니다. 아마 (Num a) 대신에 (Real a)를 써야했습니다. –

+0

항상 Num, Real, Floating 및 Fractional의 차이를 잊어 버렸습니다 ... –

답변

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 

효과가있는 것 같습니다. "오버로드"에 대한 typeclasses의 메커니즘을 사용

> 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 
+0

'fromRational. toreational'는 틀림없이 자체 처벌이다. (http://comments.gmane.org/gmane.comp.lang.haskell.libraries/15565 참조) – geekosaur

+0

감사합니다. 도움이되었습니다. 나는이 기능들을보고 그것들을 사용하려했지만, 분명히 잘못된 곳에서 시도했다. –

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 참조하십시오.