: 당신은 당신이로
foo
을
Number
의 당신의 정의를 유지하고 정의 할 수 있습니다
data Complex a = (a,a)
유형이있는 경우
을
하스켈 접근법은 하나의 유형으로 통합하려는 것이 아니라 Complex Float
및 Complex Int
에 대해 다른 유형을 사용하는 것입니다. 타입 클래스를 사용하면 한 번에 이러한 유형을 모두 정의 할 수 있습니다 : 한 번 Complex Int
는 등 Complex Double
, Complex Rational
는 사실조차 Complex (Complex Int)
를 정의 정의
data Complex a = C a a
instance Num a => Num (Complex a) where
(C x y) + (C u v) = C (x+u) (y+v)
(C x y) * (C u v) = C (x*u-y*v) (x*v+y*u)
fromInteger n = C (fromInteger n) 0
...
이에.
을 Complex Double
에 추가하는 방법은 정의하지 않습니다. 더하기 (+)는 여전히 유형이 (+) :: a -> a -> a
이므로 Complex Int
을 Complex Int
에, Complex Double
을 다른 Complex Double
에만 추가 할 수 있습니다. 당신이 명시 적으로 변환해야 다른 유형의 번호를 추가하기 위해
, 예컨대 :
addIntToComplex :: Int -> Complex Double -> Complex Double
addIntToComplex n z = z + fromIntegral n
하스켈의 숫자 형식의 클래스 사이 더 유용한 변환 기능 http://www.haskell.org/tutorial/numbers.html 10.3에서보세요.
업데이트 : 귀하의 의견에 응답
, 나는 종류에 더 많은 작업에 덜 집중하는 것이 좋습니다 것입니다.
import Data.Ratio
main = do
putStrLn $ "as a Double: " ++ show (onethird :: Double)
putStrLn $ "as a Complex Double: " ++ show (onethird :: Complex Double)
putStrLn $ "as a Ratio Int: " ++ show (onethird :: Ratio Int)
putStrLn $ "as a Complex (Ratio Int): " ++ show (onethird :: Complex (Ratio Int))
...
하스켈은 "사용자가"결정하자 어떤 의미에서이 모든 숫자 클래스에서 일반 "1/3"값을 나타냅니다
onethird = 1/3
:
예를 들어,이 정의를 고려 표현식을 평가할 숫자 유형.
'con2 (Complex Float)'형식의'ComplexNum'을'con3 (Complex Rational)'형식 중 하나에 추가 할 수있을 것이라고 어떻게 예상합니까? –
@Tom 이러한 함수를 직접 제공하여 ("승격"/ 형식 변환 등) - Number는 Int, Integer 등 원하는 모든 숫자 표현을 포함하며 Number에 대해 소수를 인스턴스화 한 다음 자체 클래스를 인스턴스로 제공합니다 분수 A => 분수 (복소수 a)'. 나는 누군가가 내 자신의 Data.Complex 대신 이것을 사용하는 방법을 알기를 바랬다. – user3125280
@ user3125280 이유가 무엇입니까? 유형에 대한 지식과 통제력의 상실로 인해 귀하는 무엇을 얻게됩니까? –