我可以使用类的每个构造函数构建一个字符串列表吗?

时间:2017-06-07 18:44:53

标签: list haskell types

我有一个简单的数据类型,例如:

data Class = Class1
           | Class2
           | Class3
           deriving (Show, Eq)

我是否有一种简单的方法来构建一个包含每个字符串版本的字符串列表,以便:

func Class = ["Class1", "Class2", "Class3"]

2 个答案:

答案 0 :(得分:5)

答案是肯定的,但有一点需要注意。 func的类型是什么?看起来它的第一个参数是一个类型,而不是一个值。更多关于后来...

派生Enum使您能够列出连续的构造函数,并派生Bounded使您能够获得此枚举的“第一个”和“最后”元素。

data Class = Class1
           | Class2
           | Class3
           deriving (Show, Eq, Enum, Bounded)

然后,我们可以通过enumFromTo minBound maxBound(或仅[minBound .. maxBound])获取所有元素的列表。

但是,回到关于func类型的初始问题。您需要传入一个类型作为参数。通常的方法是使用ProxyScopedTypeVariables

{-# LANGUAGE ScopedTypeVariables #-}

import Data.Proxy (Proxy(..))

func :: forall a. (Enum a, Bounded a, Show a) => Proxy a -> [String]
func Proxy = map show $ enumFromTo minBound (maxBound :: a)

在GHCi上试试这个:

ghci> func (Proxy :: Proxy Class)
["Class1","Class2","Class3"]
ghci> func (Proxy :: Proxy Bool)
["True","False"]

答案 1 :(得分:3)

你也许可以做这样的事情:

data Class = Class1 | Class2 | Class3 deriving (Show, Eq, Enum)

GHCI:

Prelude> fmap show $ enumFrom Class1
["Class1","Class2","Class3"]