haskell 向函数传递类型提示

ffdz8vbo  于 2023-04-12  发布在  其他
关注(0)|答案(1)|浏览(110)

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

(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
xwbd5t1u

xwbd5t1u1#

可以,您可以使用TypeApplications [ghc-doc]

{-# LANGUAGE ScopedTypeVariables, TypeApplications #-}

convertsToFrom :: forall a . Enum a => Int -> Bool
convertsToFrom z = fromEnum (toEnum z :: a) == z

然后你可以使用这个与convertsToFrom @Colour为例。

相关问题