传递类型提示给函数



我想检查我是否正确地实现了枚举。也就是说,我想确认

(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,例如。

相关内容

  • 没有找到相关文章

最新更新