算法很难懂,是吧?
就怕碰上有美术功底的作者!
Adit用手绘插图的办法,把算法掰开了揉碎了讲给你。
所以说知识没有多么讳莫如深,只是没有被精妙地表述出来。
Adit Bhargava,
软件工程师,兼具计算机科学和美术方面的教育背景,在
adit.io
撰写编程方面的博客。
因为爱好,Adit踏入了编程殿堂。
Visual Basic 6 for Dummies
教会了他很多基础知识,但始终对算法没搞明白。直到遇到一位优秀的算法教授后,他才认识到这些概念是多么地简单且优雅。
几年前,他开始在adit.io上撰写图解式博文,介绍函数式编程、Git、机器学习和并发。图解式写作风趣幽默、化繁为简、清晰明确,受到大量读者的喜爱。
我们主要聊了些:
-
为什么要写这样一本萌萌的算法入门书
-
封面插画背后的故事
-
Adit神秘的算法导师
-
Adit最喜欢的算法
-
评判算法的重要指标
-
编程学习低龄化
为什么想写这样的一本入门书,充满了有趣的场景和可爱的手画插图?
学习一些新事物的时候,我自己通常会做笔记,因为这可以帮助我学习。比如,下面是我学习《抽象代数》时的原版笔记。有趣场景加上手画插图是我一直使用的学习技巧,我认为它对其他人也会同样有用,所以写了这篇博文。看了
博客文章
,人们挺喜欢的,所以我想做成一本相同风格的书可能会很好。
学习 Monad 的渠道:
-
取得计算机科学专业的博士学位。
-
压根儿不学。这里根本用不到那些条条框框!
Functor 将一个普通函数应用到被封装的值上:
Applicative 将一个封装的函数应用到封装的值上:
Monad 将一个 “接受普通值并回传一个被封装值” 的函数应用到一个被封装的值上,这一任务由函数
>>=
(读作 bind)完成。听起来似乎很拗口,让我们来看个例子吧,还是熟悉的
Maybe
:
假设
half
是只对偶数感兴趣的函数:
half x = if even x
then Just (x `div` 2)
else Nothing
如果扔给
half
一个封装的值会怎样?
这时,我们需要用
>>=
把被封装的值挤到
half
中。猜猜
>>=
的照片:
对!就是马桶塞~
再看看它的效果:
> Just 3 >>= half
Nothing
> Just 4 >>= half
Just 2
> Nothing >>= half
Nothing
这其中究竟发生了什么?Monad 是另一种类型类,这是它定义的一部分:
class Monad m where
(>>=) :: m a -> (a -> m b) -> m b
下图展示了
>>=
各个参数的意义:
下面的定义让
Maybe
成了 Monad:
instance Monad Maybe where
Nothing >>= func = Nothing
Just val >>= func = func val
来看看执行
Just 3
时发生了什么:
如果传入
Nothing
就更容易了:
你还可以把这些调用过程连起来,比如执行
Just 20 >>= half >>= half >>= half
会得到
Nothing
:
从书封看,我以为《算法图解》的手绘插图是老鼠系列的。似乎并没有,还有其他的形象像绵羊、鸟、兔子等。为什么要把那张照片放在书封上?
我希望我有一个更好的答案给你!Manning选择了封面上的图片,他们真的很喜欢这张图。但内容方面,Manning给了我很大的主动权。
很多读者非常好奇你在作者简介部分提到的算法老师。这位优秀的老师如何把概念变得简单又优雅,你能分享一些他/她的教学方法吗?