高阶函数的威力

 

高阶函数的威力

 

All about monads里看到的解释mondad的例子,令人感动的优雅代码,我用纯foldl改写,去除了其中monad的内容,这样初学haskell的人应该也看得懂。

我们先定义类型羊(Sheep)和两个函数,求羊的父亲和母亲

type Sheep = String

father :: Sheep -> Sheep
father s = "f_" ++ s

mother :: Sheep -> Sheep
mother m = "m_" ++ m

如果要查找羊的奶奶或者爷爷怎么办呢?很简单

grandma :: Sheep -> Sheep
grandma s = mother (mother s)

grandpa :: Sheep -> Sheep
grandpa s = father (father s)

当然,依次类推,你可以写上几页代码把羊的十八代祖宗都写出来,但我相信正常的程序员不会愿意那么干的。

那么我们就来看看利用高阶函数能写出怎样优雅的实现。

--  我们传递一个函数(Sheep->Sheep)的集合来作为第二个参数,然后利用foldl来计算它。
findAncestor :: Sheep -> [(Sheep -> Sheep)] -> Sheep
findAncestor s l = foldl getParent s l  -- 将函数作为参数传递
        where getParent s f = f s

用法

findAncestor "dolly" [mother,father,father]   -- dolly's mother's father's father
findAncestor "dolly" [father,mother,father,mother]   -- dolly's father's

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值