首先,如果我重复这一点,我想道歉,但我在没有找到问题答案的情况下到处搜索。
假设我有以下代码:
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]
显然,这种类型没有任何值构造函数。所以我认为我能在这里做的是从原始类型创建一个类型,通常在定义中保存指定值的任何值吗?我的问题是如何构建这种类型的实例,如果这个定义不正确,我将如何实现我之前描述的内容?
由于
答案 0 :(得分:3)
实际上,您的 类型具有值构造函数 - 其中三个实际上名为Nothing
,Int
和Float
。所以,人们可以写,例如
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))
。