Haskell-- concatMap详解

经过了几次Haskell的作业后,发现concatMap对于list的作用极其强大,下面就具体讲解一下concatMap的作用:

1.concatMap定义及类型:

  • Map a function over a list and concatenate the results.
  • 将函数映射到列表并连接结果
  • concatMap :: (a -> [b]) -> [a] -> [b]

2.Map定义及类型:

  • returns a list constructed by appling a function (the first argument) to all items in a list passed as the second argument
  • 返回一个通过将函数(a->b)应用于作为第二个参数([a])传递的列表中的所有项而构造的列表
  • (a -> b) -> [a] -> [b]

3.举例说明

Prelude> map (enumFromTo 1) [1,3,5]
[[1],[1,2,3],[1,2,3,4,5]]

Prelude> concatMap (enumFromTo 1) [1,3,5]
[1,1,2,3,1,2,3,4,5]

Prelude> map (\x -> [(x,x+2,x/2)]) [1,3,5]
[[(1.0,3.0,0.5)],[(3.0,5.0,1.5)],[(5.0,7.0,2.5)]]

Prelude> concatMap (\x -> [(x,x+2,x/2)]) [1,3,5]
[(1.0,3.0,0.5),(3.0,5.0,1.5),(5.0,7.0,2.5)]

从上述例子中,可以看出concatMap就是将map的结果连接成为一个list。

其实,concatMap就是利用foldr函数,将(++)函数与f复合为foldr函数的第一个参数:

concatMap  :: (a -> [b]) -> [a] -> [b]
concatMap f =  foldr ((++) . f) []

想一下,给你一个list如何给每一个元素末尾加上“!”??
利用concatMap可以巧妙解决这一问题:

Prelude> concatMap (++"! ") ["one", "two", "three"]
"one! two! three! "

Prelude> concatMap (++"!") ["one", "two", "three"]
"one!two!three!"
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值