foo bar , A _ A, X Y. (X) . , - , :
data X = XA A | XB B | XC C
data Y = YA A | YB B
. ? , X A, B, C, Y A, B. A, B C . , A B , X, Y.
, (X Y ), . , , .
, , , A, B C:
class HasA t where hasA :: t -> Bool
class HasB t where hasB :: t -> Bool
class HasC t where hasC :: t -> Bool
:
data A = A Int
data B = B Char
data C = C Bool
data X = XA A | XB B | XC C
data Y = YA A | YB B
X, Y:
instance HasA X where
hasA (XA _) = True
hasA _ = False
instance HasB X where
hasB (XB _) = True
hasB _ = False
instance HasC X where
hasC (XC _) = True
hasC _ = False
instance HasA Y where
hasA (YA _) = True
hasA _ = False
instance HasB Y where
hasB (YB _) = True
hasB _ = False
instance HasC Y where
hasC = const False
foo bar, X, Y s.
foo :: (HasA t, HasB t, HasC t) => t -> Int
foo v | hasA v = 1
| hasB v = 2
| hasC v = 3
| otherwise = undefined
bar :: (HasA t, HasB t) => t -> Bool
bar v | hasA v = True
| hasB v = False
| otherwise = undefined
xs = [ XA (A 1), XB (B '1'), XC (C True) ]
ys = [ YA (A 1), YB (B '1') ]
, foo , HasA, HasB HasC, bar , HasA HasB ( , HasC bar). False , foo bar undefined.
:
ghci> map foo xs
[1,2,3]
ghci> map foo ys
[1,2]
ghci> map bar xs
[True,False,*** Exception: Prelude.undefined
ghci> map bar ys
[True,False]
, bar X s, undefined, , A B. , , , .
A, B C, -, .
class HasA t where getA :: t -> Maybe A
.