Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 我可以使用类的每个构造函数构建字符串列表吗?_List_Haskell_Types - Fatal编程技术网

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

List 我可以使用类的每个构造函数构建字符串列表吗?,list,haskell,types,List,Haskell,Types,我有一个简单的数据类型,例如: data Class = Class1 | Class2 | Class3 deriving (Show, Eq) 是否有一种简单的方法可以构建一个字符串列表,其中包含每个字符串的字符串版本,以便: func Class = ["Class1", "Class2", "Class3"] 也许你可以这样做: data Class = Class1 | Class2 | Class3 derivin

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

data Class = Class1
           | Class2
           | Class3
           deriving (Show, Eq)
是否有一种简单的方法可以构建一个字符串列表,其中包含每个字符串的字符串版本,以便:

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

也许你可以这样做:

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


也许你可以这样做:

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


答案是肯定的,但有一个警告。
func
的类型是什么?它的第一个参数似乎是一个类型,而不是一个值。更多关于稍后


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

data Class = Class1
           | Class2
           | Class3
           deriving (Show, Eq, Enum, Bounded)
然后,我们可以通过
enumFromTo minBound maxBound
(或者只是
[minBound..maxBound]
)获得所有元素的列表

但是,回到关于
func
类型的初始问题。您需要将类型作为参数传入。通常的方法是使用
代理
范围类型变量

{-# 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"]

答案是肯定的,但有一个警告。
func
的类型是什么?它的第一个参数似乎是一个类型,而不是一个值。更多关于稍后


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

data Class = Class1
           | Class2
           | Class3
           deriving (Show, Eq, Enum, Bounded)
然后,我们可以通过
enumFromTo minBound maxBound
(或者只是
[minBound..maxBound]
)获得所有元素的列表

但是,回到关于
func
类型的初始问题。您需要将类型作为参数传入。通常的方法是使用
代理
范围类型变量

{-# 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"]

某种程度上。。。
func
的类型是什么?有点。。。什么是
func
?虽然你的答案是更多的教育,也许更完整,但我接受另一个答案只是因为它更简单地满足了我的需求。谢谢你的回复!我认为另一个答案不符合问题中设定的条件。如果你已经可以使用“Class1”,为什么不使用所有其他的呢?@karakfa你的评论可能是为了其他答案?我看不出它在这里是如何应用的……这比我的答案好得多,所以我要删除它(就是我的答案)。@MarkSeemann我会接受Alec的答案,因为你认为它更好,但我认为值得把你的答案留给后代。虽然你的答案更受教育,也许更完整,我接受另一个,只是因为它更简单地满足了我的需要。谢谢你的回复!我认为另一个答案不符合问题中设定的条件。如果你已经可以使用“Class1”,为什么不使用所有其他的呢?@karakfa你的评论可能是为了其他答案?我看不出它在这里是如何应用的……这比我的答案好得多,所以我要删除它(就是我的答案)。@MarkSeemann我会接受Alec的答案,因为你认为它更好,但我认为值得把你的答案留给后代。这正是我一直在寻找的!谢谢@我认为亚历克的答案要好得多。你应该接受它而不是我的。这正是我想要的!谢谢@我认为亚历克的答案要好得多。你应该接受它而不是我的。