如何在没有模式匹配的情况下检查变量是否属于某种数据类型?
data MyData = A | B | C char deriving (Eq) -- This works. isA :: MyData -> Bool isA x = x == A -- This generates a compile error. isC :: MyData -> Bool isC x = x == C
编辑:忘记添加deriving Eq
.
作为术语,您要检查变量是否与某个数据构造函数匹配,而不是类型.你所有的价值观都是类型的MyData
; 你正在检查他们匹配的构造函数.
话虽如此,没有充分理由避免模式匹配.事实上,Haskell实现的正确惯用方法isA
是:
isA A = True isA _ = False
或者,如果您愿意:
isA x = case x of { A -> True; _ -> False }
同样,正确的实施方式isC
是:
isC (C _) = True isC _ = False
要么:
isC x = case x of { C _ -> True; _ -> False }
如果你试图避免模式匹配,因为你担心它在某种程度上比测试平等效率低,所以不要理会这个概念.它是确定值的构造函数的最有效方法.
如果你试图避免模式匹配,因为你不喜欢语法或对这种技术有某种个人厌恶,那么你有我的同情心:学习Haskell对你来说将是一个悲惨的经历.