String = "Nothing#" } data class Just(val value: T) : Maybe() } 很快我们就会看到将函数应用到 Just上 还是应用到...但是 fmap 怎么知道如何应用该函数的呢? 究竟什么是 Functor 呢? 在 Haskell 中 Functor 是一个类型类。 其定义如下: ?...我们可以为其定义 fmap 如下: fun Iterable.fmap(transform: (T) -> R): List = this.map(transform)...例如: infix fun Iterable R>.`(*)`(iterable: Iterable) = this.flatMap { iterable.map...于是现在我们知道 Maybe 既是 Functor 、又是 Applicative 还是 Monad。 现在我们来看看另一个例子:IO monad: ?
no side effects),有几个好处: 引用透明(referential transparency) 可推理(reason about your code) P.S.关于引用透明,见基础语法_Haskell...没错,是Functor: -- Haskell class Functor f where fmap :: (a -> b) -> f a -> f b fmap定义的行为恰恰是对容器里的内容(值)做映射...curry(f.bind(null, arg)) : f(arg);// fmap :: (a -> b) -> Effect a -> Effect b fmap = curry(fmap);// test...(increment) .map(double) .map(cube) calculations.run(); // 8 这一系列map运算都是不含副作用的,直到最后run()才会引发fZero...double)(); // (0 + 1) * 2 ^ 3 // compose(compose(compose(fZero, increment), double), cube)(); 五.总结 无论依赖注入还是
前言 在看《Haskell趣学指南》这本书的Build Our Own Type and Typeclass一章时,不是很好理解,这里结合《Real World Haskell》这本书做一下记录。...fixity指定了他应该是left-associative还是right-associative,还有他的优先级。infixr是右结合,infixl是左结合,infix无左右优先性。优先级0-9。...从上面我们可以看到fmap接收一个从a类型映射到b类型的函数和一个装有a类型值的functor,返回一个装有b类型值的functor 看下学list时学到的map函数: Prelude> :t map...map :: (a -> b) -> [a] -> [b] 它接收一个从a类型映射为b类型的函数,和一个装有a类型值的List返回一个装有b类型值的List 是不是很像fmap,不错,List正是一个Functor...的instance,而map就是fmap的实现(这一点看下ghci中:info Functor的打印结果就能确认)。
前段时间学了下 Haskell,看完了《Haskell 趣学指南》,刷了一些题,《Real World Haskell》正在看。...Functor 谈 Monad(单子) 之前还是要谈谈 Functor(函子),毕竟所有的 Monad 都是 Functor。...在范畴论中,函子是范畴间的一类态射(这个定义给我的直观感受是函子指的是 fmap 函数……),数学上的概念就不多说了,下面我们来看看 Haskell 中的 Functor。...Haskell 中有一个叫 Functor 的类型类(暂时可以粗略地理解为 OO 语言中的接口),它的定义是这样的: class Functor f where fmap :: (a -> b) -...事实上并不是这样,函子毕竟是一个数学概念,它必须满足函子定律: fmap id = id famp (f . g) = fmap f . fmap g id 是一个原样返回参数的函数(id x = x)
如果你还是无法理解这个列表,不妨把这种形式想象成链表:Cons的第一个参数就是当前结点的值,第二个参数就是下一个结点;列表的最后总是连接尾结点Nil。...fmap = lmap Applicative 但是我们没法直接声明Monad的instance,因为在Haskell中,Functor与Monad之间还有一个Applicative。...还是用例子来说明。上一篇文章的最后,我举了一个多参函数的例子。当时我们封装了一个函数liftM2用来处理2参数的函数。...它的行为就是取第一个参数m a的值,将其应用在第二个参数的函数(这个函数也叫monadic map)。由于这个函数并不是在容器中的,因此>>=的实现比起Applicative要更容易些。...和ap是一致的 Traversable实际上只要求Applicative,但是实现上却要求Monad 这么多明明相同的东西却有那么多不同的表示方法(甚至写的烂的话,它们的行为还会不同),可想而知这会给编码造成多大的混乱
前言 上一篇《我的第一个面向需求的Haskell程序》文章中的Haskell程序还存在一个问题: 程序只打印出了文件中有没有重复的元素但是并没有告知是哪一个元素重复了,重复了几次也没有打印出来。...所以我继续优化下上篇文章中的Haskell程序,现在这段程序变成了下面这样 代码 module Main where import Data.List.Split import Data.List import...::[String] -> IO () check [filename] = do contents <- readFile filename mapM_ printRepeat $ fmap..., "def", "ghi", "def"] 然后使用group函数聚合下这个List,得到: [["abc", "abc", "abc"], ["def", "def"], ["ghi"]] 再通过fmap...(\(x:xs) -> (x, 1 + length xs))即map一个lambda表达式到这个List上,将这个List中的每个元素转为元组,得到: [("abc", 3), ("def", 2)
想象力实在丰富的话,可以想作生化盒子(魔斯拉),或者坩埚(女巫森林一张新卡)之类的能让内容发生变化的盒子,嗯,试管 函数层面的fmap就是函数组合,对着map a to b的函数,做一发map b to...->) r部分 二.Functor laws 之前有提到: 实现Functor时需要遵循一些规则,比如不希望List元素顺序发生变化,希望二叉搜索树仍保留其结构性质等等 (摘自深入typeclass_Haskell...我们知道Functor圈定了一类能被map over的东西,可以对着Functor实例用fmap,把普通函数作用于Functor的计算语境 似乎足够强大了,但有些特殊场景,例如: > :t fmap (...w) 内置的Applicative实例都遵从这些规则,但同样只是道德约束,手动实现Applicative实例时要自觉遵守 Applicative style 通过和可以达到非常优雅的调用式风格...getLine 相当优雅,让Functor层面的运算与普通运算在形式上几乎没什么差异了(从形式上消除了运算所处context的差异) 参考资料 Lifting What is “lifting” in Haskell
零.Typeclass与Class Typeclass就是Haskell中的接口定义,用来声明一组行为 OOP中的Class是对象模板,用来描述现实事物,并封装其内部状态。...over)的东西 class Functor f where fmap :: (a -> b) -> f a -> f b fmap接受一个map a to b的函数,以及一个f a类型的参数,返回一个...但无论怎样,fmap结果都是List a(这里的a是类型变量) 听起来非常自然,因为List本就属于Functor类,并且: map :: (a -> b) -> [a] -> [b] 这不就是fmap...:: (a -> b) -> f a -> f b类型定义的一个具体实现嘛,实际上,这个map就是那个fmap: instance Functor [] where fmap = map Maybe...Constraint也是一种kind,表示必须是某类的instance(即类型约束,经常在函数签名的=>左边看到),例如Num,具体见What does has kind ‘Constraint’ mean in Haskell
现在我们把num2当作一个独立的数据,并假设存在一个方法fmap可以操作这个数据,可能是这样的。 图 46 得到的还是对象,但操作通过一个纯函数addOne去实现了。...首先,fmap的目的是把数据从一个类型映射到另一个类型,而JavaScript里面的map函数实际上就是这个功能。...比如一个三角形有三个顶点A/B/C,那么我们可以表示一个三角形为ABC或者ACB,三角形还是这个三角形,但是从ABC到ACB一定是经过了某种变换。...6.1 优点 除了上面提到的风格和特性之外,函数式编程相对其他编程范式,有很多优点: 函数纯净 程序有更少的状态量,编码心智负担更小。...代码简洁/流程更清晰 通常函数式编程风格的程序,代码量比其他编程风格的少很多,这得益于函数的高度可组合性以及大量的完善的基础函数,简洁性也使得代码更容易维护。
image This is where fmap comes in. fmap is from the street, fmap is hip to contexts. fmap knows how to...Use fmap: > fmap (+3) (Just 2) Just 5 ? image Bam! fmap shows us how it's done!...language without Maybe: post = Post.find_by_id(1) if post return post.title else return nil end But in Haskell...Here's the definition: instance Functor [] where fmap = map Okay, okay, one last example: what happens...Haskell also provides us with some syntactical sugar for monads, called do notation: foo = do filename
现在我们把num2当作一个独立的数据,并假设存在一个方法fmap可以操作这个数据,可能是这样的。 得到的还是对象,但操作通过一个纯函数addOne去实现了。...首先,fmap的目的是把数据从一个类型映射到另一个类型,而JavaScript里面的map函数实际上就是这个功能。...比如一个三角形有三个顶点A/B/C,那么我们可以表示一个三角形为ABC或者ACB,三角形还是这个三角形,但是从ABC到ACB一定是经过了某种变换。...优点 除了上面提到的风格和特性之外,函数式编程相对其他编程范式,有很多优点: 函数纯净 程序有更少的状态量,编码心智负担更小。...代码简洁/流程更清晰 通常函数式编程风格的程序,代码量比其他编程风格的少很多,这得益于函数的高度可组合性以及大量的完善的基础函数,简洁性也使得代码更容易维护。
一个函子Functor是任意类型,这些类型定义了如何应用 map (fmap in Haskell) 。...也就是说,如果我们要将普通函数应用到一个有盒子上下文包裹的值,那么我们首先需要定义一个叫Functor的数据类型,在这个数据类型中需要定义如何使用map或fmap来应用这个普通函数。...image.png fmap的输入参数是a->b函数,在我们这个案例中是(+3),然后定义一个函子Functor,这里是Haskell的Just 2,最后返回一个新的函子,在我们案例中,使用Haskell...image.png functor: 应用一个函数到包裹的值,使用fmap/map. applicative: 应用一个包裹的函数到包裹的值。...在Haskell中,函子是在其上可以map over的东西。稍微有一点函数式编程经验,一定会想到数组(Array)或者列表(List),确实如此。
fmap 是最常用的高阶函数之一,它将一个函数应用于一个容器(例如列表)中的每个值。...square [1,2,3,4,5] -- returns [1,4,9,16,25] 用这种风格编写的代码往往是可组合的和可测试的。...虽然我们最后还是要手动验证代码结果,例如在浏览器中刷新页面或使用工具来验证 JSON 端点,但许多这样的操作可以推迟到编程会话结束时进行。...每张发票必须包含这个发票所针对的行项目的一个列表,并具有一个表明订单已付款还是已取消的发票状态。...Haskell 社区对于每种函数类别(例如解码 / 编码 JSON、解析 XML、解码 CSV、搭配 SQL 数据库、HTML 模板、websocket、使用 Redis 等)中有哪些包是不错的选择这一问题达成了普遍共识
Applicative 定律 Application 函子是一种加强的函子,在 Haskell 的 Control.Applicative 模块中定义了一个 Applicative 类型类: class...其实就是函数组合.): instance Functor ((->) r) where fmap f g = (\x -> f (g x)) 我在函子定律中提到过,fmap 接收一个函数和一个函子值...当函数作为函子值时,fmap 还是返回一个函数(这里用 lambda 表示)。...那也同理,它接收两个函子值,返回一个函子值,当函数作为函子值时,要先分别取出 f 中的值(函数)和 g 中的值,分别将一个参数 x 传递给它们,再将 g x 作为参数传递给 f x(由于 Haskell...自动柯里化的性质,f x 还是一个函数),最后将结果包裹到 lambda 中。
自从大四看了三章《SICP》之后我就自诩为一个函数式编程爱好者,之前也在公司分享过一个 Haskell 的 Topic,效果非常糟糕,讲到后来已经没剩几个人了,只得草草收场。...append = (acc, digit) => letters[digit].map(letter => acc.map(prefix => prefix + letter); 所以合起来就是这样的...', 'q', 'r', 's'], ['t', 'u', 'v'], ['w', 'x', 'y', 'z'] ]; // JS 的 flatMap 还是个实验特性...但 reduce(Haskell 中的 fold)、map(fmap)、flatMap(bind)这三个函数其实是通用的模式,不止在数组中有用,要追本溯源的话可能又绕不开范畴论了,就不在这里多说了。...真正的纯函数式语言(Haskell)是没有副作用的(或者说隐藏了副作用),而真实的世界却充满副作用,为了能够正常工作并且保持自己的纯粹,它引入了范畴论中的各种概念,很有意思但确实有比较高的门槛,而且那些复杂的理论学了平常用不到很快就忘了
,Functor到Applicative再到Monad是从一般到特殊的递进过程(Monad是特殊的Applicative,Applicative是特殊的Functor) Functor 能够把普通函数map...Just 1 fmap登场: > fmap (+1) (Just 1) Just 2 Applicative 在Functor之上的增强,能够把context里的函数map over到一个具有context...P.S.关于computation context的详细信息,见Functor与Applicative_Haskell笔记7 用来解决context相关计算中的另一个场景:怎样把一个具有context的函数应用到具有...输入布尔值,输出具有context的值(True对应放在缺省context里的(),False对应mzero) 经guard处理后,再利用>>把非幺元值恢复成原值(return x),而幺元经过>>运算后还是幺元...这个Nothing就像是硬编码装上去的炸弹,是个纯静态场景 那想要动态爆炸的话,怎么办?
命名规范 Go语言在变量命名规范遵循的是C语言风格,越简单越好。 Java建议遵循见名知意。...复合字面值由两部分组成:一部分是类型,比如上述示例代码中赋值操作符右侧的map[int]string;另一部分是由大括号{}包裹的字面值。...这个技术以逻辑学家Haskell Curry命名。...这点Java也可以做到,只不过还是用了对象的那套方式套上去的。...但不得不说上面的代码综合来说还是Go更加简洁。
lodash的reduce对数组求和: _([0,1,3,4,5]).reduce(_.add); //-> 13 实战:格式化名字 var names = ['alonzo church', 'Haskell....map(_.startCase) .sort() .value(); //-> ['Alonzo Church', 'Haskell Curry', 'Jon Von Neumann..._value + ')'; } } // wrap :: A -> Wrapper(A) const wrap = (val) => new Wrapper(val); // fmap ::...two = wrap(2); const five = two.fmap(plus3); //-> Wrapper(5) five.map(R.identity); //-> 5 const plus10...= plus(10); const fifteen = two.fmap(plus3).fmap(plus10); //-> Wrapper(15) fifteen.map(R.identity);/
无论是网页浏览、API调用还是网络服务的交互,HTTP协议都扮演着核心角色。在本文中,我们将探讨如何在Haskell编程语言中发起HTTP请求,并重点介绍如何解读HTTP响应状态。...引言Haskell是一种静态类型、纯函数式的编程语言,以其强大的类型系统和函数式编程特性而闻名。使用Haskell进行网络编程,可以享受到类型安全和表达力强的优势。...本文将提供一个全面的指南,帮助读者掌握在Haskell中处理HTTP响应的技巧。...Haskell网络编程基础在Haskell中进行网络编程,通常会用到http-conduit库,它提供了一个简单易用的API来发送HTTP请求和接收响应。...try $ httpLbs (fromString url) manager :: IO (Either SomeException (Response ByteString)) return $ fmap
func getLogicValue() -> Bool /// Haskell's fmap, which was mis-named func map(f
领取专属 10元无门槛券
手把手带您无忧上云