我想检查我是否正确地实现了枚举。也就是说,我想确认
(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
是的,您可以使用TypeApplications
[ghc-doc]<一口>一口>:
{-# LANGUAGEScopedTypeVariables, TypeApplications#-}
convertsToFrom ::forall a. Enum a => Int -> Bool
convertsToFrom z = fromEnum (toEnum z:: a) == z
,那么你可以使用它与convertsToFrom @Colour
,例如。