我有一个名为Event的数据类型。它看起来像这样:
data Event = Event { tag :: String
, description :: String
, date :: String
} deriving (Eq, Show)
我想制作一种特殊类型的事件,该事件在tag
和date
字段中始终具有后备值。基本上,我想写这样的东西(请原谅不正确的语法):
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方式思考而引起的?
答案 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
,而不更改事件的定义。