我想检查我是否正确地实现了一个枚举。也就是说,我想确认这一点
(toEnum . fromEnum) a = a
(fromEnum . toEnum) z = z
其中a是我的枚举类型的示例,z是一个int。第一种情况是可以的。
> (toEnum . fromEnum) Green == Green
True
一个返回布尔值的函数可以写成这样:
convertsFromTo :: (Enum a, Eq a) => a -> Bool
convertsFromTo a = (toEnum . fromEnum) a == a
和使用
> convertsFromTo Green
True
第二种情况比较棘手,因为编译器需要类型提示来知道要从整数构造的值的类型。
> fromEnum (toEnum 1 :: Colour) == 1
True
有没有什么方法可以将类型提示传递给函数?
convertsToFrom :: ??? -> Int -> Bool
convertsToFrom ??? z = fromEnum (toEnum z :: ???) == z
或者,是否有比在函数外调用toEnum
更好的解决方案?
convertsToFrom :: Enum a => a -> Int -> Bool
convertsToFrom a z = fromEnum a == z
> convertsToFrom (toEnum 1 :: Colour) 1
True
为了完整
data Colour = Red | Green | Blue deriving (Eq)
instance Enum Colour where
fromEnum Red = 0
fromEnum Green = 1
fromEnum Blue = 2
toEnum 0 = Red
toEnum 1 = Green
toEnum 2 = Blue
1条答案
按热度按时间xwbd5t1u1#
可以,您可以使用
TypeApplications
[ghc-doc]:然后你可以使用这个与
convertsToFrom @Colour
为例。