值构造函数中的文字值

时间:2015-07-12 15:42:49

标签: haskell

我有一个名为Event的数据类型。它看起来像这样:

data Event = Event { tag :: String
                   , description :: String
                   , date :: String
                   } deriving (Eq, Show)

我想制作一种特殊类型的事件,该事件在tagdate字段中始终具有后备值。基本上,我想写这样的东西(请原谅不正确的语法):

data GeneralEvent =       Event String String String
                  | FaultyEvent "unknown-tag" String "unknown-date"

使用记录语法来定义FaultyEvent似乎也没有提供解决方案(再次请原谅不正确的语法):::

data FaultyEvent = FaultyEvent { "unknown-tag" :: String
                               , description :: String
                               , date :: String
                               } deriving (Eq, Show)

在Haskell中有一种很好的方法可以创建一种特殊的Event吗?或者我的语法问题是由于没有以适当的Haskell方式思考而引起的?

1 个答案:

答案 0 :(得分:3)

您可以让您的类型代表您拥有的数据,并将逻辑放在"智能析构函数"即函数中。尝试

data Event = Event String String String
           | FaultyEvent String

tag :: Event -> String
tag (Event t _ _) = t
tag FaultyEvent = "unknown-tag"

-- etc.

当然,您不仅限于tag :: Event -> String,如果它更有用,您可以定义tag :: Event -> Maybe String,而不更改事件的定义。

相关问题