假设我在haskell中创建数据类型,并且此数据类型接受多个构造函数。有没有一种简单的方法可以在我的代码中稍后确定它创建的是哪一个?
编辑:
示例,我正在使用dataType
data LogicValue = CloseAnd (Int, Int) (Int, Int)
| CloseXor (Int, Int) (Int, Int)
| FarAnd LogicValue LogicValue
| FarXor LogicValue LogicValue
有没有一种简单的方法可以确定某些东西是否是一个CloseAnd?
答案 0 :(得分:9)
当然,只需在构造函数名称上进行模式匹配!
f :: LogicValue -> Ret
f (CloseAnd a b) = ...
f (CloseXor a b) = ...
当然可以使用case
开关来完成。
由于这个问题一直出现在我的通知栏中(我的回答是投票,如果我是诚实的,可能不值得)我想补充说你的问题没有任何关系“确定类型“。 data
的不同构造函数都具有相同的结果类型,即LogicValue
。您可能正在考虑“子类型”CloseAnd
,CloseXor
...,就像您可以使用OO语言一样。 Haskell变体类型与OO类层次结构有一些相似之处,但它们仍然是一个不同的概念。
答案 1 :(得分:5)
您可以使用模式匹配:
logictype :: LogicValue -> [Char]
logictype (CloseAnd _ _) = "It is a closeAnd."
logictype (CloseXor _ _) = "It is a closeXor."
logictype (FarAnd _ _) = "It is a FarAnd."
logictype (FarXor _ _) = "It is a FarXor."
您还可以匹配参数:
logictype (CloseAnd (a,b) (c,d)) = "it is a closeAnd with parameters " ++ show [a,b,c,d]