泛函编程(23)-泛函数据类型-Monad

  • 时间:
  • 浏览:0
  • 来源:uu直播快3平台

我们 在前面讨论过你这个数据类型。它们全部全部都是有兩个 同去的函数:

的确我们 从listMonad中自动获得了可用的map和map2.

现在我们 似乎要能 说任何要能 flatMap(具备flatMap函数)的数据类型全部全部都是Monad。

我们 要能 再丰厚一下现在的Monad组件库,增加多些共用组件,使Monad抽象模型能更概括实用些:

  简单来说:Monad却说泛函编程中最概括通用的数据模型(高阶数据类型)。它不但中含了所有基础类型(primitive types)的泛函行为及操作,因此任何高阶类因此自定义类一旦具备Monad形状就要能 与任何类型的Monad实例一样在泛函编程中同去提供一套通用的泛函编程办法。很多人们把泛函编程视作Monadic Programming却说为过之。那么 ,具体哪些是Monad呢?

    实际上在设计泛函库组件(combinator)时,我们 会尽量处理重复编码,实现办法却说把通用或共性的操作抽取出来形成你这个新的高阶类型(higher types),也却说新的抽象类型(Abstraction)。曾经我们 要能 在不同的组件库中对同类操作同去使用哪些通用的类型了。给给我们先看看以下的有兩个 抽象过程:

optionMonad是曾经的:

看看哪些map2函数:不但款式相同,实现办法也是相同的。不同的还是具体施用受体的数据类型。看来我们 还是因此各种数据类型的不同而重复编写了map2组件。我们 应该想办法一次实现map2后让所有数据类型实例要能 使用,从而彻底处理重复编码。要能 肯定的是哪些办法一定跟共性抽象有关。

  在前面哪些章节的讨论中我们 总是针对你这个数据类型的形状设计最基本的操作函数或组件。因此各种数据类型的不同我们 重复编写了map2组件。现在我们 看完map2是要能 用flatMap和map来实现的。那么 flatMap和map却说最基本最通用的组件几时?事实上map要能 用flatMap和unit来实现:

    在前面我们 讨论过Monoid,我们 说过它是有兩个 特殊的范畴(Category),所有数据类型的Monoid实例都同去拥有一套Monoid特有的操作及遵循一套Monoid行为定律。曾经我们 要能 把Monoid视为有兩个 抽象数据模型,在泛函算法中使用特殊的Monoid实例就要能 达到预期的效果而不会能 修改算法。那么 要能 说Monad却说有兩个 比Monoid更概括、更抽象、覆盖范畴更广的高阶数据类型了。