是否可以在 Haskell 中创建一个函数,其中 returns 数据类型的构造函数列表?
Is it possible to create a function in Haskell which returns a list of the constructors for a data type?
是否可以在 Haskell 中创建函数,其中 returns 数据类型的构造函数列表?
它应该像这样工作:
ghci> getConstructors Bool
[True, False]
ghci> getConstructors Maybe
[Nothing, Just]
想一想:列表的类型是什么? Nothing
的类型为 Maybe a
但 Just
的类型为 a -> Maybe a
.
不过你可以看看泛型。使用包 syb
:
Prelude> import Data.Data
Prelude Data.Data> dataTypeConstrs $ dataTypeOf (Just 4)
[Nothing,Just]
请注意这里 [Nothing,Just]
只是它在屏幕上的打印方式,它实际上并不是包含两个构造函数的列表。
Prelude Data.Data> :t dataTypeConstrs (dataTypeOf (Just 4))
dataTypeConstrs (dataTypeOf (Just 4)) :: [Constr]
无论如何,拥有一个包含 [Nothing,Just]
的列表(即使 Haskell 是正确的)也没有多大用处。您将无法对其中的值执行任何操作,因为您不知道它们的类型。
是否可以在 Haskell 中创建函数,其中 returns 数据类型的构造函数列表?
它应该像这样工作:
ghci> getConstructors Bool
[True, False]
ghci> getConstructors Maybe
[Nothing, Just]
想一想:列表的类型是什么? Nothing
的类型为 Maybe a
但 Just
的类型为 a -> Maybe a
.
不过你可以看看泛型。使用包 syb
:
Prelude> import Data.Data
Prelude Data.Data> dataTypeConstrs $ dataTypeOf (Just 4)
[Nothing,Just]
请注意这里 [Nothing,Just]
只是它在屏幕上的打印方式,它实际上并不是包含两个构造函数的列表。
Prelude Data.Data> :t dataTypeConstrs (dataTypeOf (Just 4))
dataTypeConstrs (dataTypeOf (Just 4)) :: [Constr]
无论如何,拥有一个包含 [Nothing,Just]
的列表(即使 Haskell 是正确的)也没有多大用处。您将无法对其中的值执行任何操作,因为您不知道它们的类型。