加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – Functor如何有用?

发布时间:2020-12-16 18:45:43 所属栏目:安全 来源:网络整理
导读:我们知道任何泛型类型F [_] withmap方法,符合某些 laws,是一个仿函数.例如,List [_],Option [_]和F [A] = Env = A是运算符.我只是想知道这个仿函数抽象是否有意义. 我如何使用它们是仿函数的事实?你能展示一个非平凡计算的例子,它会使用地图并且实际上有用
我们知道任何泛型类型F [_] withmap方法,符合某些 laws,是一个仿函数.例如,List [_],Option [_]和F [A] = Env => A是运算符.我只是想知道这个仿函数抽象是否有意义.

我如何使用它们是仿函数的事实?你能展示一个非平凡计算的例子,它会使用地图并且实际上有用吗?

解决方法

函数等概念的最大好处之一是,有一些通用结构允许您使用更简单的仿函数构建更复杂的类型,并保证这些复杂类型具有某些属性.当你像你一样孤立地考虑它们时,可以理解的是,函数看起来毫无意义,但是你学习和掌握的这些结构越多越有用.

一个更简单的例子是几种组合仿函数的方法也产生了一个仿函数;例如,如果List [A]和Option [A]是仿函数,那么:

>仿函数的组成:列表[选项[A]]和选项[列表[A]]
>仿函数产品:(列表[A],选项[A])
>仿函数的总和:[List [A],Option [A]]

我不知道在Scala中写出这个,但在Haskell中这样的事实转化为通用代码,如下例:

-- A generic type to represent the composition of any two functors
-- `f` and `g`.
newtype Compose f g a = Compose { getCompose :: f (g a) }

-- If `f` and `g` are functors,so is `Compose f g`.
instance (Functor f,Functor g) => Functor (Compose f g) where
  fmap f (Compose fga) = Compose (fmap (fmap f) fga)

这是一个非常简单的例子,但是:

>它至少作为分析工具已经很有用了.人们在实践中编写的许多数据类型,当你通过这个例子的镜头观察它们时,结果是简单仿函数的产品,总和或组合.因此,一旦理解了这些结构,您就可以在编写复杂类型时自动“感知”它是一个仿函数,以及如何编写它的map()操作.
>更精细的例子具有相同的味道:

>我们有一个通用的结构,当用实现Functor的类型实例化时保证某些契约;
>当我们向任何类型添加Functor实现时,我们可以在该构造中使用该类型.

更详细的示例是free monads(链接具有扩展的Scala示例),这是一种通用的解释器结构,它依赖于用户提供的Functors来定义语言的“指令”.其他链接(这些链接大部分来自Google搜索):

> https://softwaremill.com/free-monads/
> http://underscore.io/blog/posts/2015/04/14/free-monads-are-simple.html

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读