4

我一直在研究 Scala(以及扩展的 Haskell)一段时间,我完全被他们的类型系统和功能范式所吸引。最近,我偶然发现了“类型级编程”,并被卷入了诸如 Functor 之类的东西和其他我没听说过的东西(除了 Monad,我知道它是一种神秘的东西,但不知道该利用什么它!)。我研究了 Haskell 中的概念(顺便被它的类型系统和类型推断能力迷住了),并且我对类型成为 Functor、PointedFunctor、ApplicativeFunctor 或 Monoid 的含义有了一个纯技术层面的深刻理解(即使在技术层面上,我仍然不知道 Monad 是什么)但我 我觉得自己像个白痴,因为我认为这一切没有用,除了可能获得了对某些概念的良好分类(?)。这些东西有什么用?为什么要让生活如此复杂?为什么要研究这些东西并将它们分类为不同的类别?

4

5 回答 5

9

为什么要让生活如此复杂?

他们都是为了让生活更简单

首先,它们使我们编写的代码更干净、更清晰。

其次,它们增加了我们的表达能力,而没有添加真正的新语言特征。例如,Monads 让你使用标准语法来表达复杂的计算上下文,Functors 让你以标准方式思考和编程数据结构,Applicative Functors 让你可以像处理直接数据一样简单地处理有效或复杂的计算上下文,让你在纯数据之外干净地使用功能范式。

它们都有助于代码重用并帮助我们理解彼此的代码,因为它们为我们提供了一种思考事物的标准方式。

一旦你习惯了它们,你就不想没有它们!

于 2012-10-09T11:15:15.980 回答
5

它们都是抽象的。例如。幺半群是支持零元素和加法的东西(必须是关联的)。例如整数、列表、字符串等。我认为为所有这些不同类型提供一个通用“接口”相当不错。

那么它们为什么有用呢?例如,您可以为所有幺半群编写通用 sum 函数。您只需编写一个通用函数,而不是为字符串、整数等编写一个。我认为这很有用。

于 2012-10-09T10:55:53.400 回答
4

我们首先应该问:什么是函子,单子, ...。除非我们知道这些概念是什么(意思),否则很难谈论它们的用途。

这些概念来源于范畴论。它们源于这样一个事实,即数学中的许多对象(以及因此在函数式编程中)共享一些共同的抽象属性。一旦我们了解并理解了这些属性,我们就可以使用它们来编写非常通用的代码,这些代码可重用于大量任务。


举个例子:功能大家都知道

map :: (a -> b) -> ([a] -> [b])

拥有 from ato的函数,b我们可以创建一个适用于 lists 的函数[a]子是这个概念的概括。任何可以以这种方式映射(并保留函子定律)的东西都称为函子。所以Functor宣布

fmap :: Functor f => (a -> b) -> (f a -> f b)

在列表的情况下f变为[]. fmap我们可以映射列表(它等于map),也可以映射Maybes、各种集合、树,甚至函数。

也可以看看

于 2012-10-09T11:16:36.687 回答
3

另外我想指出单子不是“神秘的”。尤其是类似容器的 monad(list、Maybe、Identity)非常容易理解。它们与仿函数类似,但有一点不同:使用fmap原始仿函数的“形状”(例如列表中元素的数量)被保留,例如,您不能fmap用来实现类似filter. 这就是为什么 monad 有一个名为“bind”的函数(在 Haskell 中它是(>>=)),它允许这种事情,但它们也不是魔法(例如,对于列表,它与 good old 相同concatMap)。此外,monad 具有return包装单个值的功能。

现在很多其他的,不是“容器式”的东西都是单子。有些 monad 可以对“存储的计算”进行操作(Cont对于 continuation monad)。它们可以提供 ( Reader)、收集 ( Writer) 或持有 ( State) 某种“附加上下文”。一个非常有用的“上下文”是“世界其他地方的状态”,更广为人知的是IO. 在这种情况下,类型系统(尤其是多态性和类型类所施加的限制)可以屏蔽不需要的交互,并强制一定的计算顺序(这在惰性语言中不是微不足道的),所以我们不需要肮脏的 hack 或语言 back-门,以便用纯语言做 IO。有些人认为这是一种魔法,但它只是巧妙地使用了类型系统,而 monad 并不是解决这个问题的唯一方法(例如,Clean 语言为此使用了“唯一性类型”)。

于 2012-10-09T13:30:41.140 回答
1

“这些东西有什么用?” 啊! 你可以用它们来写 FizzBu​​zz: http://dave.fayr.am/posts/2012-10-4-finding-fizzbuzz.html

于 2012-10-09T13:34:17.613 回答