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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值