代码
data BookType = History | Music deriving (Show,Eq)
newtype MyBook = MyBook{bookname::BookType -> String}
newtype HisBook = HisBook{headBook::BookType -> Int->String}
newtype HerBook i r = HerBook{lowBook::i -> r}
解释说明
第一个是无参构造的多值类型
第二个带有一个构造函数的newtype类型,需要实现其bookname函数才能实例化出来
第三个带有两个构造函数,需要实现其headBook函数才能实现出来
第四个和第二个在实现上一致,但是其类型不是MyBook,而是HerBook i r。i,r取决于实现的lowBook的方式。
采用第四种的方式,主要含义是在进行Monad时,保留部分类型约束。如果仅有一个类型参数(例如Maybe a),那么在进行>>=运算时,会丢掉a的类型。那么HerBook i r的i就会被丢掉。我们就不知道到底是HerBook BookType类型,还是HerBook String类型了。
-- (show $ toUpper.head bt) ++ ":" ++ (show count)
main = do
let c = MyBook{bookname = \bt -> show bt}
let d = HisBook{headBook = \bt count -> (show $ toUpper.head $ show bt)++ ":" ++ (show count)}
let e = HerBook{lowBook = \bt -> (show $ map toLower $show bt)}
let f = HerBook{lowBook = \bt -> length $ show bt}
print $ bookname c History
print $ headBook d History 14
print $ lowBook e History
print $ lowBook f History
接下来是同义转换
newtype History t a = History {observe :: t -> a }
d::History Int Int
d = History $ \x -> (x + 1)
data HistoryData t a = HistoryData t
myobserve :: HistoryData t a -> (t->a) -> a
myobserve (HistoryData t) f = f t