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

泛函编程(28)-粗俗浅解:Functor, Applicative, Monad

经过了一段时间的泛函编程讨论,始终没能实实在在的明确到底泛函编程有什么区别和特点;我是指在现实编程的情况下所谓的泛函编程到底如何特别。...我们已经习惯了传统的行令式编程(imperative programming),总是先入为主的认为软件编程就是一行接着一行的更改某些变量状态指令:明刀明枪,字里行间目的和方式都很明确。...我们就以一步步更改程序状态的方式,一行一行的拼凑指令:这就是典型的行令式编程了。 泛函编程,顾名思义,就是用一个个函数来编程。讲的再深入点就是通过函数组合来更改程序状态。什么意思?为什么?...严格来讲,在泛函编程中是没有在某个地方申明一个变量,然后在一些函数里更新这个变量这种方式的。与申明变量相对应的是泛函编程会把所谓变量嵌入在一个结构里,如:F[A]。F是某种高阶类型,A就是那个变量。...如果我们需要去更改这个变量A就必须设计一套专门的函数来做这件事了。从某些方面这也解释了何谓泛函编程。我用粗俗的语言来描述这两种编程模式的区别:行令编程就像在床面上打扑克,而泛函编程就好比在被窝里打牌。

1.1K60

从以太坊;MorphToken事件;看智能合约构造函数大小写编码错误漏洞

owned,任何以太坊账户均可调用该函数夺取合约的所有权,进一步实现盗币等系列非法操作。...如果程序员在编写合约时将构造函数名称写错,那么原本的构造函数将成为任何人都可以调用的普通函数。...在Owned合约中,由于错误的编码,将构造函数名称写错,owned函数成为了一个普通函数。...0x02 漏洞现场还原 任何以太坊账户都可以调用Bank合约继承自Owned合约的owned函数,更改Bank合约的owner变量,从而使合约所有权发生转移。...如下如所示,0x14723a09acff6d2a60dcdf7aa4aff308fddc160c这个账户调用了Bank合约的owned函数后,可以看到Bank合约的owner变成了0x14723a09acff6d2a60dcdf7aa4aff308fddc160c

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

    泛函编程(1)-泛函编程是如何实现的

    泛函编程就是把函数组合起来形成一个完整的程序。可想而知,函数组合的过程可以是曲折的,形成的程序可以是复杂的。那么泛函编程又是如何保证一个复杂的函数组合程序是正确无误的呢?...这个什么不可变化特性解释的够绕的了吧?实际上这也是泛函编程的重点所在,我看还是要解释清楚才行。     泛函程序是由纯函数组成。...我抛开了英文Referencial Transparent的字面意思把它翻译成”可等量替换的“。我们可以通过”等量替换“方式来分析理解函数行为。...泛函编程要求尽量使用”不可改变的“(Immutable)数据结构来保证程序的纯洁性。泛函编程就好像是使用”不可改变的“数据结构过程的挣扎,起码对我来说是这样的。...整个函数简洁明了的多。不经过中间变量直接返回结果;这就是泛函编程的一个风格特征。

    1.7K80

    【Kotlin】Kotlin 领域特定语言 DSL 原理 一 ( DSL 简介 | 函数 属性扩展 )

    DSL ( Domain Specific Language ) 领域特定语言 : 针对某一个特定的领域的语言 , 如 SQL 语言 ; 2 ....DSL 用途 : DSL 用于某个特定领域 , 主要是该领域的专家使用 , 通过简单的编程 , 可以描述该领域中的事物 , 这个简单的编程语言就是 DSL 领域特定语言 ; 如 SQL 是给数据库管理员使用的管理数据库的...Iterable 是要扩展函数的类型 ( 为该类扩展函数 ) ; ③ 扩展函数名称 : maxBy 是扩展的函数名称 ; ④ 函数参数 : selector: (T) -> R 是扩展函数的参数 ,...表示该参数不能为 空 ; ⑥ 方法体 : 在方法体中调用传入的函数类型 , 获取元素中符合 selector(T) 调用返回值 最大值的元素 ; /** * Returns the first element...属性扩展格式 : 为一个定义好的类在外部定义一个新的属性 , 为 T 类型定义新的属性 , 使用如下格式扩展函属性 ; var 要扩展属性的类型的属性类型>.被扩展的属性名称

    53120

    编程语言:类型系统的本质

    引子 我一直对编写更好的代码有浓厚的兴趣。如果你能真正理解什么是抽象,什么是具象,就能理解为什么现代编程语言中,接口和函数类型为什么那么普遍存在了。...我总结了一个常见编程语言类型的分类图,注意拆分的四个区域是分区,比如PHP和JS都是动态弱类型。...编程语言中的基本类型 本节介绍编程语言类型系统的特性,从基本类型开始,到函数类型、OOP、泛型编程和高阶类型(如函子和单子)。...它是一种新的函数组合方式,可以链式调用,可以用于约束传输的数据结构,可以映射适配函数的输出值与下一个函数输入值,可以一定程度上避免函数执行的副作用。 函子的用途是什么呢?...这个问题需要从前面讲过的函数组合(Function Composition)讲起。 函数组合是一种把多个函数组合成新函数的方式,它解决了函数嵌套调用的问题,还提供了函数拆分组合的方式。

    2.6K31

    从以太坊MorphToken事件看智能合约构造函数大小写编码错误漏洞

    owned,任何以太坊账户均可调用该函数夺取合约的所有权,进一步实现盗币等系列非法操作。...在小于0.4.22版本的solidify编译器语法要求中,构造函数的名称应该和合约名称保持一致。如果程序员在编写合约时将构造函数名称写错,那么原本的构造函数将成为任何人都可以调用的普通函数。...在Owned合约中,由于错误的编码,将构造函数名称写错,owned函数成为了一个普通函数。...[d666f0b0-a307-4ab3-99ef-8a841f579c09.png-w331s] 0x02 漏洞现场还原 任何以太坊账户都可以调用Bank合约继承自Owned合约的owned函数,更改Bank...如下如所示,0x14723a09acff6d2a60dcdf7aa4aff308fddc160c这个账户调用了Bank合约的owned函数后,可以看到Bank合约的owner变成了0x14723a09acff6d2a60dcdf7aa4aff308fddc160c

    93430

    “零基础”也能学会的python 函数

    理 解 函 数 在中学数学中,可以用这样的方式定义函数:y=4x+3,这就是一个一次函数,当然,也可以写成:f(x)=4x+3。其中x 是变量,它可以代表任何数。...这是一个有趣的问题,自己搜索一下,看能不能找到答案。 我也不清楚原因。不过,我清楚地知道,变量可以用x,也可以用别的符号,甚至用alpha、beta 这样的字母组合也可以。...其实在高级语言编程中,变量比我们在初中数学中学习的要复杂。但是,先不管那些,现在,就按照初中数学的难度来研究Python 中的变量。...当然,这种方式的函数在编程实践中没什么用途,仅仅在这里冒出来,后面绝对不用这个形式了。 输入 a=3,然后输入y,看看得到什么结果呢?...看Python 对命名的一般要求。 文件名:全小写,可使用下画线。 函数名:小写,可以用下画线风格单词以增加可读性。如:my_function、my_example_function。

    35530

    编程范式 —— 函数式编程入门

    该系列会有 3 篇文章,分别介绍什么是函数式编程、剖析函数式编程库、以及函数式编程在 React 中的应用,欢迎关注我的 blog 命令式编程和声明式编程 拿泡茶这个事例进行区分命令式编程和声明式编程...在函数式编程中数据在由纯函数组成的管道中传递。 函数式编程可以用简单如交换律、结合律、分配律的数学之法来帮我们简化代码的实现。...可以将范畴理解为一个容器, 把原来对值的操作,现转为对容器的操作。如下图: 学习函数式编程就是学习各种函子的过程。...= value } map(fn) { return new Functor(fn(this.value)) } } 但是在函数式编程中, 要避免使用 new 这种面向对象的编程方式...join 和 flatmap 接口, 调用者从而可以扁平化嵌套的函子。

    70710

    Python:python基础知识简单介绍

    简介 可更改(mutable)与不可更改(immutable)对象,在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象...python 函数的参数传递: **不可变类型:**类似 C++ 的值传递,如整数、字符串、元组。如 fun(a),传递的只是 a 的值,没有影响 a 对象本身。...如果在 fun(a) 内部修改 a 的值,则是新生成一个 a 的对象。 **可变类型:**类似 C++ 的引用传递,如 列表,字典。...,self.age)) #单继承示例 class student(people): grade = '' def __init__(self,n,a,w,g): #调用父类的构函...__init__(self,n,t) test = sample("Tim",25,80,4,"Python") test.speak() #方法名同,默认调用的是在括号中参数位置排前父类的方法

    7110

    【C语言----函数详解】

    引言 在C语言编程中,函数扮演着至关重要的角色。它如同乐高积木,将复杂的程序分解成一个个独 立、可重复使用的模块,使代码更加简洁、易读、易维护。...函数名: 函数的名称,遵循变量命名规则。 参数列表: 函数接收的参数,每个参数包括数据类型和参数名。参数列表可以为空,表示函数不接收任何参数。...函数的声明 函数声明告诉编译器函数的名称、返回类型和参数列表,以便在函数调用之前进行类型检查。函 声明通常放在头文件 (.h) 中。...// 声明 add 函数 int add(int a, int b); 三、函数的调用 函数调用是指使用函数名和实际参数来执行函数。实际参数的值会传递给函数定义中的形式参数。...int result = add(10, 20); // 调用 add 函数,并将返回值存储在 result 中 四、函数参数传递 C语言中,函数参数传递有两种方式: 值传递: 将实际参数的值复制一份传递给形式参数

    11700

    函数的说明与使用

    函数与库函数就一样了,可以直接使用,与库函数的区别为库函数使用的时候需要包含头文件,自定义函要我们自己写出作用,然后可以直接调用。...三、函数的参数 1.形式参数(形参) 形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内 存单元),所以叫形式参数。...如例1就是传值调用, 将num1,num2的值传给get_max函数 2、传址调用 传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。...这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操 作函数外部的变量。...函数的声明一般要放在头文件中的。 2函数定义 函数的定义是指函数的具体实现,交待函数的功能实现。 七、函数的递归 1.什么是递归? 程序调用自身的编程技巧称为递归( recursion)。

    16710

    为 PHPer 准备的 Go 入门知识

    最近,我开始为我的工作团队开发内部命令行界面应用程序。我选择的主要编程语言是 PHP,但是我想用可以在任何平台上运行的语言创建该程序,而不必安装解释器。...Go 的程序化编程模型真的很适合我们 PHP 开发者的思维习惯,我得以快速启动并运行该应用程序。尽管与 PHP 有一些明显的区别,所以我想与想要学习 Go 的其他 PHP 开发人员分享这些区别。...If 语句 if 语句的工作方式和 PHP 中是相同的,但是它不需要用括号包住判断条件。这种差异最初让我在阅读 Go 的代码时感到困惑。但是,我认为这让代码更具可读性....包内任何以大写字母开头的名称都可以用在其他包中。...来调用结构体的方法.

    1.4K20

    Go语言核心编程(2)——函数

    注:本文是《Go语言核心编程》(李文塔/著)个人读书笔记 函数定义 首字母大小写决定函数在其他包的可见性,大写时其他包可见,小写时只有相同的包可以访问。...多个相邻的同类型的参数可以使用简写模式 不支持默认参数 不支持函数重载 实参与形参 Go 函数实参到形参的传递永远是值拷贝,即使是参数是指针也是值拷贝,传递给形参的是这个指针变量的副本, 二者指向同一地址...函数签名 函数签名也就是函数类型,一个函数的签名就是指函数定义首行去掉函数名、参数名和{ 两个函数类型相同的条件是:拥有相同的形参列表和返回值列表(列表元素的次序、个数和类型都相同),形参名可以不同...匿名函数 匿名函数可以看作函数字面量 , 所有直接使用函 数类型变量的地方都可以由匿名函数代替。医名函数 不定参数 不定参数类型必须一致 多个参数时,不定参数必须是最后一个。...Go 语言典型的错误处理方式是将 error 作为函数最后一个返回值 。 在调用函数 时 , 通过检测其返回的 error 值是否为 nil 来进行错误处理。

    75820

    《JavaScript ES6 函数式编程入门经典》读书笔记

    函数式编程简介 函数式编程是一种范式,我们能够以此创建仅依赖输入就可以完成自身逻辑的函数。这保证了当函数多次调用时仍然返回相同的结果。函数不会改变任何外部环境的变量,这将产生可缓存,可测试的代码库。...MayBe函子是用来处理函数式编程空值问题的,实现如下: // 定义一个容器 跟上面一样的 就是改了一个名字 const MayBe = function(val) { this.value = val...Either函子 const Either = { Some : Some, Nothing: Nothing } // 到这里 我想你应该还是一头雾水 这个有什么用处呢?...是不是纸老虎,在说chain方法之前我们先简单的说一下另一个方法join,上面我们创建MayBe函子以后最后都要调用.value来返回真正的值,这里添加一个join方法,如果不为空的时候就返回函子的value...Generator 本书最后一章介绍了ES6的Generator的使用,这里就简述一下: // 创建Generator(就是函数名和function之间加一个*) function* gen() {

    2.3K21

    连续反转!DeepMind遭俄罗斯团队质疑:我们该如何证明神经网络懂物理世界?

    论文链接:https://www.science.org/doi/epdf/10.1126/science.abj6511 文中提出的DM21模型准确地模拟了复杂的系统,如氢链、带电的DNA碱基对和二元过渡态...研究问题 化学是21世纪的中心科学(确信),比如设计具有指定特性的新材料,如生产清洁电力或开发高温超导体,都需要在计算机上对电子进行模拟。...,即所谓的密度泛函仍然未知,必须进行近似求解。...虽然DFT涉及一定程度的近似,但它是研究物质在微观层面如何以及为何以某种方式表达的唯一实用方法,因此已成为所有科学领域中使用最广泛的技术之一。...而电荷运动和键断裂是许多重要技术应用的核心,但这些问题也可能导致描述最简单分子(如氢)的官能团出现大量定性失败。

    53520

    Js 异步处理演进,Callback=u003EPromise=u003EObserver

    这是我参与11月更文挑战的第11天,活动详情查看:2021最后一次更文挑战 ---- 异步调用就像是接水管,相互缠绕的管道越多,就越容易漏水。...Observer 处理多个异步操作数据流是很复杂的,尤其是当它们之间相互依赖时,我们必须以更巧妙的方式将它们组合;Observer 登场!...observer 创建(发布)需更改的数据流,subscribe 调用(订阅消费)数据流;以 RxJs 举例: function callApiFooA(){ return fetch(urlA...这写法,这模式不就是函数式编程中的函子吗?Observable 就是被封装后的函子,不断传递下去,形成链条,最后调用 subscribe 执行,也就是惰性求值,到最后一步才执行、消费!...got value 4 done ---- 小感:Js 异步处理演进分为 3 个阶段:Callback=>Promise=>Observer,重点理解也就是 Observer,Observer 就像是函数编程的函子

    2K10

    为 PHPer 准备的 Go 入门知识

    大家好,又见面了,我是全栈君。 最近,我开始为我的工作团队开发内部命令行界面应用程序。我选择的主要编程语言是 PHP,但是我想用可以在任何平台上运行的语言创建该程序,而不必安装解释器。...Go 的程序化编程模型真的很适合我们 PHP 开发者的思维习惯,我得以快速启动并运行该应用程序。尽管与 PHP 有一些明显的区别,所以我想与想要学习 Go 的其他 PHP 开发人员分享这些区别。...If 语句 if 语句的工作方式和 PHP 中是相同的,但是它不需要用括号包住判断条件。这种差异最初让我在阅读 Go 的代码时感到困惑。...包内任何以大写字母开头的名称都可以用在其他包中。...任何以小写字母开头的名称只能在包内使用。不需要 private 或 public 进行声明。 Strings 在 Go 中,所有字符串必须用双引号包围。

    47110

    图解Python 函数

    如果想要定义函数,则需要以“def 函数名():”的格式为开头编写代码。在这之下的一个模块就是一个函数的范围。Python的模块就如前文中提到的,是根据缩进的等级来进行区分的。...其中函数所处 理的值被称为参数、函数所返回的结果的值被称为返回值。 ? 2 函数的定义 将上文中的函数按Python的方式记述,则会变为如下格式。像这样将函数的功能记述出来的方式被称为定义函数。...参数在不必要的时候可以省略 ? 如果要做一个什么命令都不执行的函数,则用pass。 ? 函数的调用 1 调用的基本形式 (位置参数) 函数可以用如下的方式调用。...在函数被用于嵌套中时,只在其每一单次的函数调用内有效。 ? 2 非本地变量的更改 在函数中想要改变其外部的变量的时候需要注意几个要素,像下图那样简单地记述代入命令 是无法改变外部变量的。 ?...如果想要使用生成器的话,需要以下几个步骤:1.需要定义生成器函数;2.需要调用生成器函 数并且初始化;3.将生成器对象作为参数调用next()函数。

    1.1K40

    图解 Python 函数

    如果想要定义函数,则需要以“def 函数名():”的格式为开头编写代码。在这之下的一个模块就是一个函数的范围。Python的模块就如前文中提到的,是根据缩进的等级来进行区分的。...其中函数所处 理的值被称为参数、函数所返回的结果的值被称为返回值。 2 函数的定义 将上文中的函数按Python的方式记述,则会变为如下格式。像这样将函数的功能记述出来的方式被称为定义函数。...参数在不必要的时候可以省略 如果要做一个什么命令都不执行的函数,则用pass。 函数的调用 1 调用的基本形式 (位置参数) 函数可以用如下的方式调用。...在函数被用于嵌套中时,只在其每一单次的函数调用内有效。 2 非本地变量的更改 在函数中想要改变其外部的变量的时候需要注意几个要素,像下图那样简单地记述代入命令 是无法改变外部变量的。...如果想要使用生成器的话,需要以下几个步骤:1.需要定义生成器函数;2.需要调用生成器函 数并且初始化;3.将生成器对象作为参数调用next()函数。

    64300

    C++函数定义 | 输出有参无参

    C++无参函数的定义 函上一节小林已经讲过,从函数形式来看,函数分为无参函数和有参函数,那么他们有什么不同呢?...定义无参函数的一般形式为 类型标识符 函数名([void])//注意void可以省略不写 {   声明部分   语句 } C++有参函数的定义 有参函数,顾名思义,有参数的函数,和无参函数相比,有参函数多了参数...,定义如下所示 类型标识符 函数名(形式参数表列) {   声明部分   语句 } 学习了无参函数和有参函数的不同,接下来看一个例子巩固下知识点 经典案例:C++实现无参数和有参数函数,并输出相应文字描述...调用这个方法会输出我是无参函数  } int PrintFace(int temp)//自定义有参数函数  {   cout的值    cout...PrintFace(3);//调用有参函数    return 0;//函数返回值为0  } 执行本程序之后,会输出 我是无参函数 ---------------- 3 我是有参函数 --------

    1.4K2927
    领券