haskell Monoids

1

  • 函数同样接受两个参数

  • 参数跟回传值是同样的类型

  • 同样存在某些值当套用二元函数时并不会改变其他值 mempty `mappend` x = x

  • 遵守结合律 (x `mappend` y) `mappend` z = x `mappend` (y `mappend` z)



2  import Data.Monoid    


class Monoid m where   
    mempty :: m   
    mappend :: m -> m -> m   
    mconcat :: [m] -> m   
    mconcat = foldr mappend mempty
instance Monoid [a] where   
    mempty = []   
    mappend = (++)
Lists are monoids . Product and Sum


newtype Product a =  Product { getProduct :: a }   
    deriving (EqOrdReadShowBounded)
instance Num a => Monoid (Product a) where   
    mempty = Product 1   
    Product x `mappend` Product y = Product (x * y)
Any and ALL


newtype Any = Any { getAny :: Bool }   
    deriving (EqOrdReadShowBounded)
instance Monoid Any where   
    mempty = Any False   
    Any x `mappend` Any y = Any (x || y)
newtype All = All { getAll :: Bool }   
        deriving (EqOrdReadShowBounded)
instance Monoid All where   
        mempty = All True   
        All x `mappend` All y = All (x && y)
instance Monoid Ordering where   
    mempty = EQ   
    LT `mappend` _ = LT   
    EQ `mappend` y = y   
    GT `mappend` _ = GT


instance Monoid a => Monoid (Maybe a) where   
    mempty = Nothing   
    Nothing `mappend` m = m   
    m `mappend` Nothing = m   
    Just m1 `mappend` Just m2 = Just (m1 `mappend` m2)
另一种有趣的 monoid 使用方式就是让他来帮助我们 fold 一些数据结构。 由于有太多种数据结构可以 fold 了,所以我们定义了  Foldable  这个 typeclass。就像  Functor  是定义可以 map over 的结构。 Foldable  是定义可以 fold 的结构。在  Data.Foldable  中有定义了一些有用的函数,但他们名称跟  Prelude  中的名称冲突。所以最好是用 qualified 的方式 import 他们:

import qualified Foldable as F
ghci> :t foldr   
foldr :: (a -> b -> b) -> b -> [a] -> b   
ghci> :t F.foldr   
F.foldr :: (F.Foldable t) => (a -> b -> b) -> b -> t a -> b
foldMap :: (Monoid m, Foldable t) => (a -> m) -> t a -> m
instance F.Foldable Tree where   
    foldMap f Empty = mempty   
    foldMap f (Node x l r) = F.foldMap f l `mappend`   
                                f x           `mappend`   
                                F.foldMap f r

3

基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计),个人经导师指导并认可通过的高分设计项目,评审分98分,项目中的源码都是经过本地编译过可运行的,都经过严格调试,确保可以运行!主要针对计算机相关专业的正在做大作业、毕业设计的学生和需要项目实战练习的学习者,资源项目的难度比较适中,内容都是经过助教老师审定过的能够满足学习、使用需求,如果有需要的话可以放心下载使用。 基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoot和微服务架构的养老机构管理系统源码(毕业设计)基于SpringBoo
一个关于城市自行车出行的数据集,它记录了城市中自行车租赁服务的详细出行信息。该数据集通常包含多个字段,例如每次骑行的起始时间、结束时间、出发地点和到达地点的地理坐标(如经度和纬度)、骑行时长、自行车编号、用户类型(如注册会员或临时用户)等。这些丰富的数据维度为研究城市交通模式、居民出行习惯以及自行车租赁服务的运营效率提供了宝贵的信息。 数据集的规模可能因城市大小和数据收集时间跨度而异,但通常包含数万甚至数十万条记录。通过分析这些数据,可以发现城市中某些区域的骑行热度较高,例如商业区或旅游景点附近,这些地方可能是人们使用自行车的高频区域。同时,骑行时间的分布也能揭示出人们的出行规律,例如在工作日的早晚高峰时段,骑行量可能会显著增加,而在周末或节假日,骑行的目的地可能会更多地集中在休闲娱乐场所。 此外,该数据集还可以用于评估自行车租赁服务的运营状况,比如通过分析不同时间段的骑行时长和频率,了解自行车的使用效率和周转情况。对于城市规划者来说,这些数据有助于优化自行车道的布局,改善交通拥堵,促进绿色出行。而对于研究人员,它可以作为研究城市交通、环境影响以及社会行为模式的有力工具。总之,该数据集是一个极具价值的数据资源,能够为多个领域的研究和决策提供支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值