2015-07-12 58 views
1

我有一個名爲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方式思考而引起的?

+2

定義構建您的特殊事件的函數。 –

+1

要回應n.m.的評論,這應該是有趣的:https://wiki.haskell.org/Smart_constructors – Jubobs

+1

你想要什麼不能做。不過你可能對[智能構造函數]感興趣(https://wiki.haskell.org/Smart_constructors) – Bakuriu

回答

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代替,如果是比較有用,在不改變事件的定義。