Haskell的newtype研究

来源:互联网 发布:嵌套sql语句执行顺序 编辑:程序博客网 时间:2024/06/06 18:17

代码

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 Intd = History $ \x -> (x + 1)data HistoryData t a = HistoryData tmyobserve :: HistoryData t a -> (t->a) -> amyobserve (HistoryData t) f = f t
0 0
原创粉丝点击