首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

当newtype是一个Functor时,对fmap的调用会被移除吗?

newtype是一个Functor时,对fmap的调用不会被移除。

newtype是Haskell语言中的一种类型声明方式,它允许我们在编译时创建一个新的类型,但在运行时不会引入额外的开销。而Functor是Haskell中的一个类型类,它定义了一个fmap函数,用于对容器类型中的元素进行映射。

当一个newtype声明的类型实现了Functor接口时,我们可以在该类型上使用fmap函数来对其进行映射操作。这意味着我们可以对newtype包装的值进行映射,而不需要解包和重新包装。

举个例子,假设我们有一个newtype声明如下:

代码语言:txt
复制
newtype MyInt = MyInt Int

如果我们希望MyInt类型也是一个Functor,我们可以为其实现fmap函数:

代码语言:txt
复制
instance Functor MyInt where
  fmap f (MyInt x) = MyInt (f x)

这样,我们就可以在MyInt类型上使用fmap函数了:

代码语言:txt
复制
increment :: MyInt -> MyInt
increment = fmap (+1)

在这个例子中,increment函数使用了fmap来对MyInt类型的值进行映射,将其值加1。

总结起来,当newtype是一个Functor时,对fmap的调用不会被移除,而是可以在newtype类型上使用fmap函数来对其进行映射操作。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Functor与Applicative_Haskell笔记7

(.)?...)映射,因为我们无法单纯用fmap把包在一个Functor函数作用于另一个包在Functor值上 那么有没有一种任何Functor都有效通用模式,能帮助我们完成这个事情(把一个Functor...value 这正是我们想要,把一个Functor函数作用于另一个Functor值 所以,ApplicativeFunctor增强体现在函数上,增强方式让这些Functor实例都实现个...,支持把一个Functor函数作用于另一个Functor值 带来2个好处,其一多参函数更友好: 如果只是普通functor的话,我们只能将一个(单参)函数map over这个functor...喂给可以产生一个applicative functor,所以如果我们丢给他两个函数,我们能得到一个函数 所以f1 f2 f3实际效果:制造一个把f2和f3结果作为参数调用

57330

深入typeclass_Haskell笔记4

表示可做映射(能被map over)东西 class Functor f where fmap :: (a -> b) -> f a -> f b fmap接受一个map a to b函数,以及一个...具体类型) 带入List上下文,就是允许List内容做映射,得到另一个List,新List内容类型可以发生变化。...而fmap定义行为恰恰容器里内容(值)做映射,完了再装进容器 还有一些特殊场景,比如Either: data Either a b = Left a | Right b -- Defined...:: (a -> b) -> f a -> f bf)不能变,所以Nothing一样处理。...* -> * -> *(需要两个具体类型参数),而fmap想要(a -> b)* -> *(只要一个具体类型参数),所以应该Either部分应用一下,填充一个参数使之成为* -> *,那么mapEither

46110

当我们谈论Monad时候(二)

对于列表,fmap作用就是遍历每一个列表元素,并它们应用传入函数f。...标准库Functor定义如下: class Functor f where fmap :: (a -> b) -> f a -> f b 没有具体定义fmap就是我们需要实现函数...Applicative“应用”抽象,它允许在容器中“存放”一个函数。 还是用例子来说明。上一篇文章最后,我举了一个多参函数例子。当时我们封装了一个函数liftM2用来处理2参数函数。...但是如果按照这个方法,我们一个数量参数都需要写一个liftM*函数,非常麻烦。而对于容器外面的普通函数,我们就不会遇到这个问题,因为函数都是柯里化。所以,为什么不把柯里化引入Functor呢?...Haskell中全符号、被小括号包裹函数默认中缀,比如这个函数调用就是中缀形式f xs。接受一个容器内函数和值,并将运算之后结果重新放在容器中。

78010

Js-函数式编程 前言什么函数式编程为什么Js支持FP纯函数柯里化组合 compose范畴学functorMonadApplicative FunctorFunctorMonadApplic

函数式代码来说,pointfree 是非常好石蕊试验,因为它能告诉我们一个函数是否接受输入返回输出小函数。比如,while 循环不能组合。...,普通函数就他们不再起作用了,所以我们需要加一个接口来让外部函数也能作用到容器里面的值(像Array也是一个容器): Container.prototype.fmap = function(f){...Functor(函子)实现了 fmap 并遵守一些特定规则容器类型。...__value() 问题很明显出来了, 我们需要连续调用两次_value才能获取, 那么假如我们嵌套了更多呢, 难道每次都要调用一大堆__value, 那当然不可能。...举一个简单例子, 假设有两个同类型 functor,我们想把这两者作为一个函数两个参数传递过去来调用这个函数。 // 这样行不通,因为 2 和 3 都藏在瓶子里。

1.7K40

newtype_Haskell笔记8

而言,这两种实现都是可取,但[]无法同时拥有两种不同Applicative实现,所以造出了ZipList,让它以拉链结对方式实现Applicative P.S.这里提到Applicative...类定义行为,具体见Functor与Applicative_Haskell笔记7 二.newtype ZipList就是因这个场景而产生,本质上List包装,定义如下: newtype ZipList...不像type创建别名类型可以与原类型等价换用,newtype创建新类型与原类型完全不同东西,唯一联系新类型内部实际操作原类型(通过持有原类型实例引用),通过这种方式在外层实现原类型扩展...要求newtype声明类型只能有一个值构造器,并且这个值构造器只能有一个参数(field)。...例如: > head [1, undefined, 3, undefined, undefined] 1 > let (a, _) = (1, undefined) in a + 1 2 特殊地,函数调用模式匹配本身需要计算

59830

一名Java开发Go语言学习笔记:语言基本特性

Go在Runtime,程序结构封闭。但Java并不是,基于Classloader动态加载,实现许多灵活特性,比如Spring,FlinkSQL。...对于编程范式支持 在Java中,类一等公民。支持继承、组合,函数式编程有一定支持。 在Go中,函数一等公民(多返回值),对于函数式编程支持较为完备。对面向对象完全通过组合来实现。...Java传参中,传一个函数,其实是通过一个匿名对象来传,而Go真正一个函数。但在编写,Go需要把原型写一遍(和设计有关,尽量简洁),而Java有语法糖可以写很简单。...简单来说就是你有一个T1,T2类型,他们有各自方法,当你声明一个T类型并包含了T1,T2类型field,那么T就拥有了T1,T2方法。...// 我们一般会这样 `同步地` 调用它 f("direct") // 使用 `go f(s)` 在一个协程中调用这个函数。

12210

Applicative 函子

同普通函子一样,一个类型构造器要成为 Applicative 实例的话,它 kind 必须* -> *,即接受一个参数,返回一个具体类型。...至于的话,先考虑函数作为普通函子情况,我们知道函子值一个包涵上下文值,函数作为函子值,从这个上下文中取值操作就是将一个参数传递给该函数,然后产生一个值,所以函数作为Functor类型类实例这样...(这种情况下 fmap 其实就是函数组合.): instance Functor ((->) r) where fmap f g = (\x -> f (g x)) 我在函子定律中提到过,fmap...函数作为函子值fmap 还是返回一个函数(这里用 lambda 表示)。...那也同理,它接收两个函子值,返回一个函子值,函数作为函子值,要先分别取出 f 中值(函数)和 g 中值,分别将一个参数 x 传递给它们,再将 g x 作为参数传递给 f x(由于 Haskell

72310

用 350 行代码从零开始,将 Lisp 编译成 JavaScript

整数对应它本身值,变量对应它在当前环境中绑定值,表达式列表对应一个函数调用,该列表一个参数相应函数,剩下表达式传递给这个函数参数。...现在我们想让这个解析器更灵活,我们将会定义一些常用类型实例。这些实例让我们能够将小巧解析器和复杂解析器结合在一起(因此它名字叫做 “解析器组合器”)。 第一个 Functor 实例。...我们需要 Functor 实例,因为我们要能够解析值应用函数从而使用不同解析器。当我们定义自己语言解析器,我们将会看到关于它示例。...它完成时候,会返回成功运行解析器列表。many1 做事情一样,但解析失败它至少会抛出一次异常。...JSExpr 类型 JavaScript 表达式 抽象表示。我们会把自己语言中表达式抽象表示 Expr 转译成 JavaScript 表达式抽象表示 JSExpr。

97540

《JavaScript函数式编程指南》读书笔记

纯函数所具有的性质: 仅取决于提供输入,而不依赖于任何在函数求值期间或调用间隔可能变化隐藏状态和外部状态。 不会造成或超出其作用域变化。如修改全局变量对象或引用传递参数。...引用透明:如果一个函数对于相同输入始终产生相同结果,那么说它是引用透明。 函数式编程指为创建不可变程序,通过消除外部可见副作用,来纯函数声明式求值过程。..._.chain一个好处可以惰性计算,在调用value()前并不会真正执行任何操作。 它返回一个lodash包装对象,而不是原生对象。...就比如一个5个参数函数我们通过应用部分可以定义为一个给定了2个特定参数函数,那么调用时候只要给另外三个就行了。...Functor(函子)一个可以将函数应用到它包裹值上,并将结果再包裹起来数据结构。

97743

什么 Monad (Functional Programming)?函子到底是什么?ApplicativeMonad

一个特殊幺元,能够和任何元素组合,导致结果不改变这些元素。 函子到底是什么? 一个函子Functor任意类型,这些类型定义了如何应用 map (fmap in Haskell) 。...也就是说,如果我们要将普通函数应用到一个有盒子上下文包裹值,那么我们首先需要定义一个Functor数据类型,在这个数据类型中需要定义如何使用map或fmap来应用这个普通函数。...image.png fmap输入参数a->b函数,在我们这个案例中(+3),然后定义一个函子Functor,这里HaskellJust 2,最后返回一个函子,在我们案例中,使用Haskell...image.png functor: 应用一个函数到包裹值,使用fmap/map. applicative: 应用一个包裹函数到包裹值。...函数式编程一种过程抽象思维,就是当前动作去进行抽象,关注动作。 ?

4.2K30

Monad_Haskell笔记10

一.从Functor到Monad 从类型来看,Functor到Applicative再到Monad从一般到特殊递进过程(Monad特殊Applicative,Applicative特殊Functor...) Functor 能够把普通函数map over到一个具有contextfmap :: (Functor f) => (a -> b) -> f a -> f b 用来解决context相关计算中最简单场景...Just 1 fmap登场: > fmap (+1) (Just 1) Just 2 Applicative 在Functor之上增强,能够把context里函数map over到一个具有context...普通函数 + 普通值:函数调用 函数输入输出类型不一致情况 函数输入普通值,输出context里值 + context里值:Monad 函数输入普通值,输出context里值 + 普通值:直接调用...换言之,Monad就是支持>>=操作Applicative functor而已 returnpure别名,所以仍然接受一个普通值并把它放进一个最小context中(把普通值包进一个Monad里面

71150

深入理解函数式编程(下)

上面这个例子里面的Num,实际上就是一个最简单Monad,而fmap属于Functor(函子)概念。...首先,fmap目的把数据从一个类型映射到另一个类型,而JavaScript里面的map函数实际上就是这个功能。...图 48 看起来Monad只是一个实现了fmap对象(Functor类型,mappable接口)而已。...但Monad类型不仅是一个Functor,它还有很多其他工具函数,比如: bind函数 flatMap函数 liftM函数 这些概念在学习Haskell可以遇到,本文不作过多提及。...(尽管它没有像上一个例子一样引入IO/Monad等概念) 4.3 超长文本省略:Ramdajs为例 图 68 这个也是常见前端场景,文本长度大于X,显示省略号,这个实现使用Ramdajs。

89730

深入理解函数式编程(下)

上面这个例子里面的Num,实际上就是一个最简单Monad,而fmap属于Functor(函子)概念。...首先,fmap目的把数据从一个类型映射到另一个类型,而JavaScript里面的map函数实际上就是这个功能。...看起来Monad只是一个实现了fmap对象(Functor类型,mappable接口)而已。...但Monad类型不仅是一个Functor,它还有很多其他工具函数,比如: bind函数 flatMap函数 liftM函数 这些概念在学习Haskell可以遇到,本文不作过多提及。...(尽管它没有像上一个例子一样引入IO/Monad等概念) 超长文本省略:Ramdajs为例 这个也是常见前端场景,文本长度大于X,显示省略号,这个实现使用 Ramdajs 。

44610

编程语言:类型系统本质

在这个级别,代码和数据没有区别,所以系统误将代码当成数据,或者将数据当成代码,就很容易发生错误。...同时,在动态类型语言中添加编译类型检查工作也在推进中:Python添加了类型提示支持,而TypeScript这种语言纯粹是为了在JavaScript中添加编译类型检查而创建。...为T指定了实际类型,就创建了具体函数。具体类图示例如下: 再例如,一个泛型二叉树。 泛型高阶函数 map() , filter() , reduce() 代码和示意图如下。...例如,Tnumber,我们得到类型一个数值数组number[],而Tstring,得到类型一个字符串数组string[]。这种构造函数也称为“种类”,即类型T[]种类。...函子定义(Functor Laws ) 恒等定律:fmap id = id 组合定律: fmap (g . h) = (fmap g) .

2.6K31

扫码

添加站长 进交流群

领取专属 10元无门槛券

手把手带您无忧上云

扫码加入开发者社群

相关资讯

热门标签

活动推荐

    运营活动

    活动名称
    广告关闭
    领券