나는 좋은 운동을 내놓았지만 효과를 내지 못한다.유형 선언 된 인스턴스에 대한 추론
아이디어는 형식 검사기가 숫자가 유효한지 여부를 알려주는 방식으로 로마 숫자를 시도하고 표현하는 것입니다.
{-# LANGUAGE RankNTypes
, MultiParamTypeClasses #-}
data One a b c = One a deriving (Show, Eq)
data Two a b c = Two (One a b c) (One a b c) deriving (Show, Eq)
data Three a b c = Three (One a b c) (Two a b c) deriving (Show, Eq)
data Four a b c = Four (One a b c) (Five a b c) deriving (Show, Eq)
data Five a b c = Five b deriving (Show, Eq)
data Six a b c = Six (Five a b c) (One a b c) deriving (Show, Eq)
data Seven a b c = Seven (Five a b c) (Two a b c) deriving (Show, Eq)
data Eight a b c = Eight (Five a b c) (Three a b c) deriving (Show, Eq)
data Nine a b c d e = Nine (One a b c) (One c d e) deriving (Show, Eq)
data Z = Z deriving (Show, Eq) -- dummy for the last level
data I = I deriving (Show, Eq)
data V = V deriving (Show, Eq)
data X = X deriving (Show, Eq)
data L = L deriving (Show, Eq)
data C = C deriving (Show, Eq)
data D = D deriving (Show, Eq)
data M = M deriving (Show, Eq)
i :: One I V X
i = One I
v :: Five I V X
v = Five V
x :: One X L C
x = One X
l :: Five X L C
l = Five L
c :: One C D M
c = One C
d :: Five C D M
d = Five D
m :: One M Z Z
m = One M
infixr 4 #
class RomanJoiner a b c where
(#) :: a -> b -> c
instance RomanJoiner (One a b c) (One a b c) (Two a b c) where
(#) = Two
instance RomanJoiner (One a b c) (Two a b c) (Three a b c) where
(#) = Three
instance RomanJoiner (One a b c) (Five a b c) (Four a b c) where
(#) = Four
instance RomanJoiner (Five a b c) (One a b c) (Six a b c) where
(#) = Six
instance RomanJoiner (Five a b c) (Two a b c) (Seven a b c) where
(#) = Seven
instance RomanJoiner (Five a b c) (Three a b c) (Eight a b c) where
(#) = Eight
instance RomanJoiner (One a b c) (One c d e) (Nine a b c d e) where
(#) = Nine
main = print $ v # i # i
이 가능 다르게 할 수 있으며,이 솔루션은 불완전하지만, 내가 생각하는 반면, 지금 나는 그것이 RomanJoiner (한 IVX) (하나 IVX) B0에 대한 인스턴스가 없다고 불평 이유를 이해할 필요가 나는 그러한 소목 장이를 선언했다.
감사합니다. 두 사람을 특별히 치료해야하는 이유는 명확하지 않지만 나머지는 다루지 않았습니다. 이것은 다른 숫자가 다른 사람들을 특별 대우해야한다는 뜻입니까? 나는 해결책을 소화해야 할 것이다. –