2013-10-13 99 views
3

我想定義一個字段上的約束,所以保留字無效。我如何在Yesod中完成這項工作?Yesod模型驗證

{-# LANGUAGE TemplateHaskell #-} 
module Sid where 

import Control.Exception 
import Data.List 
import Database.Persist.TH 
import Data.Aeson.TH 
import Text.Show 
import Text.Read 
import Data.Text 

data Sid = Sid Text 
     deriving (Show, Read) 

reserved :: [Text] 
reserved = ["abc","def"] 

allowedSid :: Text -> Sid 
allowedSid a = (assert (notElem a reserved)) Sid a 

derivePersistField "allowedSid" 
deriveJSON defaultOptions ''allowedSid 

回答

3

我會在普通的Haskell中做這個:用一些智能構造函數創建一個新類型的包裝器。這看起來是這樣的:

newtype Sid = Sid Text 

mkSid :: Text -> Maybe Sid 
mkSid t = if t `elem` reserved then Nothing else Just t 

將這個代碼模塊中,而不要導出數據Sid構造。