如何理解" SomeInts Int Ints"?

时间:2018-03-24 07:29:17

标签: haskell

这是我在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

我应该使用'否则'这里?是否有更好或更具体的方式来编写函数?

1 个答案:

答案 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,那么编译器就不会发出这样的警告,并且在添加功能或重构时很难利用编译器。