Complex aをEnumのインスタンスにする
一昨日の続き。
コメントで教えてもらった通り、Complex aをEnumのインスタンスにすると動いた。
import Complex instance RealFloat a => Enum (Complex a) where toEnum x = fromIntegral x :+ 0 fromEnum x = floor $ realPart x f x = x * (0:+1)
Hugs.Base> :load foo.hs Main> map (\x -> f(f(x)) == -x) [-3..3] [True,True,True,True,True,True,True] Main> map (\x -> f(f(x)) == -x) [0..] [True,True,True,True,True,True,True,True,True,True,True,True,True,True,True,True,True,True,True,True,True,True,True,True,True,True,True,True,True,T{Interrupted!}
Prelude.hsを見ると、
class Enum a where succ, pred :: a -> a toEnum :: Int -> a fromEnum :: a -> Int enumFrom :: a -> [a] -- [n..] enumFromThen :: a -> a -> [a] -- [n,m..] enumFromTo :: a -> a -> [a] -- [n..m] enumFromThenTo :: a -> a -> a -> [a] -- [n,n'..m] -- Minimal complete definition: toEnum, fromEnum succ = toEnum . (1+) . fromEnum pred = toEnum . subtract 1 . fromEnum enumFrom x = map toEnum [ fromEnum x ..] enumFromTo x y = map toEnum [ fromEnum x .. fromEnum y ] enumFromThen x y = map toEnum [ fromEnum x, fromEnum y ..] enumFromThenTo x y z = map toEnum [ fromEnum x, fromEnum y .. fromEnum z ]
というEnumクラスの定義と、
instance Enum Int where succ = boundedSucc pred = boundedPred toEnum = id fromEnum = id enumFrom = boundedEnumFrom enumFromTo = boundedEnumFromTo enumFromThen = boundedEnumFromThen enumFromThenTo = boundedEnumFromThenTo instance Enum Double where succ x = x+1 pred x = x-1 toEnum = primIntToDouble fromEnum = fromInteger . truncate -- may overflow enumFrom = numericEnumFrom enumFromThen = numericEnumFromThen enumFromTo = numericEnumFromTo enumFromThenTo = numericEnumFromThenTo