首页
学习
活动
专区
圈层
工具
发布

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

它能知道如何应用一个被上下文包裹的函数到一个被上下文包裹的值中。 ? image.png Monad 函子funtor是将一个普通函数应用到包裹的值: ?...image.png Applicative应用一个包裹的函数到一个包裹的值: ? image.png Monad 则是将一个会返回包裹值的函数应用到一个被包裹的值上。 ? image.png ?...applicative: 应用一个包裹的函数到包裹的值。 monad: 应用一个返回包裹值的函数到一个包裹的值。...单位元:存在一在 M 内的元素e,使得任一于 M 内的 a 都会符合 ae = e*a = a 。 接着我们看看在自函子的范畴上,怎么结合幺半群的定义得出Monad的。...在Haskell这类的强类型语言中,我们甚至可以组装自己的Tuple Monad。

5.2K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Monad_Haskell笔记10

    一.从Functor到Monad 从类型来看,Functor到Applicative再到Monad是从一般到特殊的递进过程(Monad是特殊的Applicative,Applicative是特殊的Functor...可以返回一个数组(或者结构体、链表等都行),把多个值组织到一起(放进一个数据结构),打包返回 如果一个函数返回个数组,就不确定他返回了多少个结果,这就是所谓的不确定的环境 从List的Monad实现来看...b的函数,.从右向左组合a -> b的函数 P.S.那么,有没有从右向左的Monad函数组合呢?...Applicative的只是机械地从左侧context里取出函数,应用到右侧context里的值上。...从Maybe取函数只有两种结果:要么从Nothing取不出东西来,立即爆炸;要么从Just f取出个f,运算得到Just (f x),上一步(x)没炸的话就炸不了了 所以,从应用场景来看,Monad是一种计算语境控制

    1.2K50

    当我们谈论Monad的时候(二)

    Haskell中全符号的、被小括号包裹的函数默认是中缀的,比如这个函数的调用就是中缀形式f xs。接受一个容器内的函数和值,并将运算之后的结果重新放在容器中。...而就是对函数与值都进行模式匹配,在有值的情况下将值应用给函数。 对于列表来说,情况可能稍微复杂一点。因为的参数可能是多个函数和多个值。...在IO操作中,这个优势还可以变得更加的明显。Haskell采用Monad实现IO相关的API,这个Monad就称为IO Monad。...Haskell中的IO函数都会返回一个IO Monad,而上面的代码中,我们并没有对每一条都使用之前的结果。对于部分IO Monad(如putStrLn返回的),我们直接就抛弃了这些返回值。...就这些内容能写这么多,我是没有想到的。原本这篇文章是想简单讲讲Monad的实现,之后再写点Haskell中常见的Monad的。

    1.4K10

    让Monad来得更猛烈些吧_Haskell笔记11

    从Monad实现来看,从左侧取出值a和附加信息w,将右侧函数应用到a上,并从结果取出值b和附加信息w',结果值为b,附加信息为w `mappend` w',最后用return包装结果返回m类型的值,作为...(If it turns out it doesn’t match the pattern, you get a runtime error.)...k (f r)同理,把从f取出的值喂给k,返回一个具有函数context的东西,最后把参数r喂给它,得到最终结果 好了,function现在是Monad了,那它有什么用?...P.S.能够从共享环境中读取值,这也是称之为Reader Monad的原因 三.State Monad 除日志追踪、共享环境外,还有一类最常见的问题是状态维护 然而,有一些领域的问题根本上就是依赖于随着时间而改变的状态...虽然我们也可以用 Haskell 写出这样的程序,但有时候写起来蛮痛苦的。这也是为什么 Haskell 要加进 State Monad 这个特性。

    1.9K40

    当我们谈论Monad的时候(一)

    先前我在某群提到,从Optional(也就是Haskell的Maybe)理解Monad会是一个很不错的方式。...()); } } 而这个定义,就是大多数编程语言(比如Scala、Haskell)对Monad的定义。...由于需要一个类型参数T,Monad几乎必然持有一个T类型的值(你确实可以写一个完全不持有的Monad,但是它什么都做不了)。但是这个T类型的值存在的“形式”是不确定的。...我个人认为,只是理解Monad的用途是没有必要,也没有意义去看Monad背后的数学定义的。 不过只从工程角度理解Monad是远远不够的。...下一篇文章,我将简单介绍Haskell中的Monad实现与一些有趣的Monad,作为过渡。再下一篇,我将从理论角度(主要是范畴论)介绍Monad。

    73610

    不可变的状态

    但是,如果一个语言建议一个值不可变(例如 Scala)或是强制要求一个值不可变(例如 Haskell)那又该怎么办?...只不过 IO 所管理的状态不是一个变量而是程序与整个世界之间交互的所有 IO 操作。在 Haskell 中,IO Monad 是一个基础的 Monad 6。...Haskell 声称它是一个纯函数式的语言,也就是说你写的函数都是数学上的纯函数(除了少数后门之外),接收一个值,返回一个值,不能做其他操作。...而在这样的环境下,Haskell 产生输入输出这样的副作用的方式就是使用 IO Monad。...并且,由于 Int 被封装在 IO Monad 中,现在已经无法直接获取其值,调用 f 的代码的返回值也要用 IO Monad 封装起来,这又会造成新一轮的 IO Monad 的传播。

    1.3K20

    Haskell爬虫中日志记录:监控HTTP请求与响应

    在当今信息爆炸的时代,数据抓取成为了获取信息的重要手段。Haskell,以其强大的类型系统和函数式编程特性,成为了编写高效、可靠爬虫的理想选择。然而,随着爬虫的运行,监控其行为变得尤为重要。...分析效率:评估爬虫的性能和资源消耗。Haskell日志记录工具Haskell社区提供了多种日志记录解决方案,其中log包是一个流行的选择。...它基于monad-logger库,支持多种日志级别和灵活的日志处理。...,我们了解到在Haskell编写的爬虫中实现日志记录的重要性和方法。...日志记录不仅可以帮助开发者监控爬虫的行为,还可以在出现问题时提供调试信息。使用monad-logger和log包,我们可以轻松地在Haskell中实现灵活且强大的日志记录

    81610

    利用Soup库的Haskell程序去下载图片

    想要通过Haskell的HTTP请求库下载图片,并且提到了使用Soup库。...首先,可能需要用http-conduit发起GET请求获取图片的数据。然后,处理响应,将内容保存到文件中。此外,可能需要使用到bytestring来处理二进制数据,以及文件路径相关的操作。...在 Haskell 中,利用 Soup 库来下载图片的过程涉及以下几个步骤:使用 http-conduit 库获取网页内容:我们需要获取网页的 HTML。...downloadImagesFromPage:此函数负责从给定网页 URL 中提取所有的 标签,并提取它们的 src 属性值,作为图片的链接。...// 用于选择所有符合条件的标签(在这个例子中是 标签),getAttr 用来获取标签的 src 属性。simpleHttp:这个函数用于发送 HTTP 请求并获取网页的内容。

    50900

    如何利用Haskell结合WebBits库采集淘宝图片

    在电商行业中,我们经常需要对同行的产品进行分析对比,今天我就给大家分享一个Haskell函数结合WebBits库编写的采集淘宝图片的例子,非常的简单实用,一起来学习一下吧。...```haskell-- 导入必要的库import Network.HTTP.Simpleimport Network.HTTP.Clientimport Network.HTTP.Types.Statusimport...Data.ByteString.Lazyimport Data.Maybeimport Control.Monad.IO.Class-- 获取代理IP地址getProxy :: IO (Maybe String...)getProxy = doresponse get_proxy"let status = responseStatus responseif..."Nothing -> putStrLn "无法获取代理地址"``` 我们可以很清晰的看到,上面的示例是通过获取不同的代理轮换,然后对淘宝进行访问,并打印获取到各种图片数据。

    31620

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

    如果一个函数既包含了我们的值,又封装了值的统一操作,使得我们可以在它限定的范围内进行任意运算,那么,我们称这种函数类型为Monad。Monad是一种高级别的思维抽象。 什么是Monad?...我们可以认为Array就是一个Monad实现,map把Array类型映射到Array类型,操作仍然在数组范畴,数组的值被映射为新的值。...但Monad类型不仅是一个Functor,它还有很多其他的工具函数,比如: bind函数 flatMap函数 liftM函数 这些概念在学习Haskell时可以遇到,本文不作过多提及。...要获取原始数据,可以基于这个定义一个fold方法。...Maybe和Either 有了Just的概念,我们再来学习一些新的Monad概念。比如Nothing。 Nothing表示在Monad范畴上没有的值。

    81910

    如何在 WPF 中获取所有已经显式赋过值的依赖项属性

    获取 WPF 的依赖项属性的值时,会依照优先级去各个级别获取。这样,无论你什么时候去获取依赖项属性,都至少是有一个有效值的。有什么方法可以获取哪些属性被显式赋值过呢?...如果是 CLR 属性,我们可以自己写判断条件,然而依赖项属性没有自己写判断条件的地方。 本文介绍如何获取以及显式赋值过的依赖项属性。...---- 需要用到 DependencyObject.GetLocalValueEnumerator() 方法来获得一个可以遍历所有依赖项属性本地值。...因此,你不能在这里获取到常规方法获取到的依赖项属性的真实类型的值。 但是,此枚举拿到的所有依赖项属性的值都是此依赖对象已经赋值过的依赖项属性的本地值。如果没有赋值过,将不会在这里的遍历中出现。...Dependency properties overview - Microsoft Docs 本文会经常更新,请阅读原文: https://blog.walterlv.com/post/wpf-get-local-value-enumerator.html

    5.9K40
    领券