没有输入值和多个基元类型的数据类型

时间:2016-02-20 21:06:02

标签: haskell algebraic-data-types gadt

首先,如果我重复这一点,我想道歉,但我在没有找到问题答案的情况下到处搜索。

假设我有以下代码:

data TestType = Nothing | Int | Float deriving (Show)

jaykay :: TestType -> [Char]
jaykay Int = "This is an int"
jaykay Float = "This is float!"
jaykay a = "Nothing matched.."

main :: IO()
main = do
  jaykay [PLACE HOLDER]

显然,这种类型没有任何值构造函数。所以我认为我能在这里做的是从原始类型创建一个类型,通常在定义中保存指定值的任何值吗?我的问题是如何构建这种类型的实例,如果这个定义不正确,我将如何实现我之前描述的内容?

由于

1 个答案:

答案 0 :(得分:3)

实际上,您的 类型具有值构造函数 - 其中三个实际上名为NothingIntFloat。所以,人们可以写,例如

main = putStrLn (jaykay Int)

并运行该程序将打印出This is an int。但是,我怀疑你希望你的构造函数接受相关类型的参数;所以可能想写一些像

这样的东西
data TestType = Nothing | Int Int | Float Float

以便使用TestType构造函数构造的Int类型的值将包含类型Int的附加值;同样,使用Float构造函数构造的那些将包含类型Float的值。 (注意,这里有两个单独的命名空间!有一个类型级别的名称Int来自Prelude,您现在还定义了一个类型为Int,其类型为{{ 1}}。)

使用这种更令人兴奋的新数据类型的一个例子是:

Int -> TestType

运行此程序会打印出jaykay (Int i) = "got the Int " ++ show i jaykay (Float f) = "got the Float " ++ show f jaykay a = "dunno lol" main = putStrLn (jaykay (Int 3))