Fut*_*ked 1 haskell types list
我有一个简单的数据类型,如:
data Class = Class1
| Class2
| Class3
deriving (Show, Eq)
Run Code Online (Sandbox Code Playgroud)
有一个简单的方法让我构建一个包含每个字符串版本的字符串列表,这样:
func Class = ["Class1", "Class2", "Class3"]
Run Code Online (Sandbox Code Playgroud)
答案是肯定的,但需要注意.是什么类型的func?看起来它的第一个参数是一个类型,而不是一个值.更多关于后来......
派生Enum使您能够列出连续的构造函数,并且派生Bounded使您能够获得此枚举的"第一"和"最后"元素.
data Class = Class1
| Class2
| Class3
deriving (Show, Eq, Enum, Bounded)
Run Code Online (Sandbox Code Playgroud)
然后,我们可以通过enumFromTo minBound maxBound(或只是[minBound .. maxBound])获得所有元素的列表.
但是,回到关于类型的初始问题func.您需要传入一个类型作为参数.通常的方法是使用Proxy和ScopedTypeVariables.
{-# 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)
Run Code Online (Sandbox Code Playgroud)
在GHCi试试这个:
ghci> func (Proxy :: Proxy Class)
["Class1","Class2","Class3"]
ghci> func (Proxy :: Proxy Bool)
["True","False"]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
59 次 |
| 最近记录: |