在以下代码中,我如何检查 - 仅在if
旁边添加一行内容 - foo
是否为Yes
?
data Asdf = Yes | No | Other
foo :: Asdf
foo = Yes
hello :: String
hello =
if <check if foo is Yes> -- How?
then "foo is Yes"
else "foo isn't Yes"
我知道我可以使用case
,但问题的关键在于以某种方式获得Bool
。这对我在单元测试等方面很有用。(case
很快就会变得非常混乱。)
答案 0 :(得分:7)
您可以使用
hello =
if (case foo of {Yes -> True; _ -> False})
then "foo is Yes"
else "foo isn't Yes"
但这绝对不是我推荐的。如果你可以使用Willem Van Onsem和bheklir所建议的Eq
实例那么公平;但一般来说我也会避免使用Eq。我不认为你应该努力获得一个布尔 - 布尔总是处理一些信息的信息最少的方式。直接使用case
hello =
case foo of
Yes -> "foo is Yes"
_ -> "foo isn't Yes"
更好;如果在单元测试的集合中这太笨重,为什么不定义一个基本相同的合适辅助函数呢?
答案 1 :(得分:5)
最简单的方法是对您的类型derive (Eq)
:
data Asdf = Yes | No | Other deriving (Eq)
然后您可以像正常一样使用==
:
hello =
if foo == Yes
then "foo is Yes"
else "foo isn't Yes"
您可以添加许多可能有用的类型类,例如Ord
,Enum
,Show
和Read
。