这是我在Haskell上的代码。
module CustomLists where
-- | A list of Int elements
data Ints = NoInts | SomeInts Int Ints
deriving Show
-- Examples:
ints :: Ints
ints = SomeInts 1 (SomeInts 2 (SomeInts 3 NoInts))
-- | noInts
-- Examples:
-- >>> noInts NoInts
-- True
-- >>> noInts ints
-- False
noInts :: Ints -> Bool
noInts x = case x of
NoInts -> True
otherwise -> False
我应该使用'否则'这里?是否有更好或更具体的方式来编写函数?
答案 0 :(得分:0)
关于何时使用显式构造函数otherwise
或_
,您问的是一个好的样式问题。我们假设我们有您的数据类型:
data Ints = NoInts | SomeInts Int Ints
并且您想要执行某些操作。您正在执行哪项操作将决定您应该使用哪种解决方案。例如,如果您只是进行布尔检查以查看构造函数是否为NoInts
,那么外卡是明智的:
noInts :: Ints -> Bool
noInts x =
case x of
NoInts -> True
_ -> False
请注意,我们使用_
代替otherwise
,因为otherwise
只是一个变量名称。如果您启用了警告,那么您可能会看到两个otherwise
的阴影定义,因为在您的模式otherwise = x
中,但在前奏otherwise = True
中。 2.未使用的变量otherwise
,因为表达式False
没有使用它。
所有这些说,在其他情况下,最好在构造函数上显式匹配。我们假设你正在进行一些计算:
someComputation :: Ints -> Int
someComputation x =
case x of
SomeInts x xs -> x + someComputation xs
NoInts -> 0
现在,如果您将Ints
的定义扩展为包含其他构造函数,请说| PerhapsInts [Int]
您将在someComputation
收到警告 - 因此编译器会告诉您代码应该考虑这个新的构造函数。如果您在第二种情况下使用_ -> 0
,那么编译器就不会发出这样的警告,并且在添加功能或重构时很难利用编译器。