Haskell的newtype研究

代码

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

你可能感兴趣的:(Haskell)