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

来看看几种 Monad来看看几种 Monad

do 表示法,我们其实可以用模式匹配来绑定 monadic value,就好像我们 let 表达式,跟函数参数中使用模式匹配一样。...如果模式匹配失败怎么办?当定义一个函数时候,一个模式匹配就会跳到下一个模式。如果所有都不匹配,那就会造成错误,整个程序就当掉。另一方面,如果在 let 中进行模式匹配失败会直接造成错误。...毕竟在 let 表达式情况下并没有失败就跳下一个设计。至于 do 表示法模式匹配失败的话,那就会调用 fail 函数。他定义 Monad type class 定义猪。...所以当在 do 表示法 Maybe 模式匹配失败时候,整个结果就会是 Nothing。这种方式比起让程序挂掉要好多了。...我们来看看运行结果: ghci> wopwop Nothing 这样模式匹配失败只会限制我们 monad context ,而不是整个程序失败。这种处理方式要好多了。

1K20

Haskell

Haskell是一种标准化、通用纯函数式编程语言,有限定性语义和强静态类型,Haskell,函数是一等公民。...ghc包含了三个主最要部分: ghc 编译器 ghci 交互式解析器和调试器 runghc 以脚本方式运行Haskell 而我们即将学习起点就是ghci来练习Haskell基本语法。...终端输入ghci进入交互式界面: Prelude> 1+(-1) = 0 据说“命令式属于工程师”,“函数式属于科学家”,这门语言还有哲学层面的东西。...这个项目,有趣地方在于很多审计需要符合科学与哲学,它要解决问题很像是比特币+以太坊,很有意思是它通过民主投票方式来解决分歧,我很喜欢这个特性,我们持有的Cardano代币,就能让我们进行投票,并且这不是损耗...回归语言Haskell,函数式编程其实有一点上,大家都很清楚,用很少代码来完成一件事情。Haskell还可以定义跟数学过程一一对应,这就很有意思了。

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

基础语法_Haskell笔记1

函数式思维:通过命令告诉电脑要做什么,比如求和是通过循环结构遍历所有的数,相加并记录其和 函数式思维:通过函数来描述出问题是什么,比如求和是把第一个数与其余树和相加 P.S.关于思维模式差异,请查看一场函数式思维模式洗礼...,例如: > :t 2 2 :: Num t => t 或者更生动例子: -- 无参函数,就是const two = 1 + 1 匿名函数 匿名函数即函数表达式,Haskell称之为lambda。....匿名函数->与类型声明->语义相同,都表示“映射到”(maps to) 函数组合 数学函数组合表达方式是f·g(x) = f(g(x)),Haskell与之类似: fg = f . g...作用域扩展到当前函数/List Comprehension,如果是GHCi环境,整个交互过程都可见 Case表达式 最常见case表达式就是函数定义时参数模式匹配(case表达式语法糖): tail...一般元组没有类似的工具函数,但可以通过模式匹配来自己实现: -- 取三元组首元 first (x, _, _) = x zip从List组合出元组: > zip [1, 2] ['A', 'B', 'C

1.8K30

newtype_Haskell笔记8

一.ZipList与List List场景,xs ys表示从左侧xs取出函数作用于右侧ys每一项,有两种实现方式: 笛卡尔积 拉链式一一结对 分别对应[]和ZipList,例如: import...类定义行为,具体见Functor与Applicative_Haskell笔记7 二.newtype ZipList就是因这个场景而产生,本质上是对List包装,定义如下: newtype ZipList...(typeclass)实现时 四.newtype与惰性计算 Haskell中大多数计算都是惰性(少数指的是foldl'、Data.ByteString之类严格版本),也就是说,计算只不得不算时候才会发生...惰性计算一般看起来都很符合直觉(不需要算就先不算),但特殊是,类型相关场景存在隐式计算(不很符合直觉) undefined undefined表示会造成错误计算: > undefined **...> head [1, undefined, 3, undefined, undefined] 1 > let (a, _) = (1, undefined) in a + 1 2 特殊地,函数调用时模式匹配本身是需要计算

59830

Heskell与函数式编程

就一行代码,涉及了三个函数 1)filter :从价格集合筛选出大于20价格,形成新集合 2)map:对1产生新集合进行变换处理,这里处理是每个元素*0.9,也就是打九折 3)sum:对2产生集合进行求和处理...编写第一个Haskell 编写Haskell之前需要把Haskell Platform下载下来(https://www.haskell.org/platform/),安装后使用ghci就可以进行Haskell...我电脑是Windows,Windows下打开cmd,输入ghci,就能进入编程界面,在这个界面能够进行简单编码,比如下面: ? 这里简单进行了一次 3+5求和操作。...类型和函数 Haskell是静态类型,也就是编译器在编译过程中就能够明确每个值类型,当发现类型不匹配时候,在编译过程中就会报错。比如输入这样一个函数: ?...== 是个表达式,编译时候会进行1和”2“类型判断,1是Int类型,”2“是[Char]类型,因此会报编译错误。 ?

79670

热爱函数式你,句句纯正 Haskell【类型篇】

我们从 wiki 上可以找到以下要点: Haskell 是一种标准化,通用纯函数式编程语言,有惰性求值和强静态类型; Haskell,“函数是第一类对象”。...调试 目前 Haskell 主要编译器是 GHC,下载地址,你可以创建 .hs 文件,用 Notepad++ 打开。 GHCi 是 GHC 一部分,可以解析、调试 Haskell 程序。...认识下 GHCi 命令: :l 用来导入当前路径或者指定路径下文件; Prelude> :l "C:\\Users\\ User\\Desktop\\HelloWorld\\HelloWorld.hs...我们在下一小节做更为细致说明“类型类”~ 类型别名 一个数据类型可以由多个其他类型组成, Haskell ,可以用 type 关键字将这些复杂类型替换成为其他简单名字; Prelude>...,以及类型类底下各种函数,真的太好用了吧~ 不用理会类型转换,特别是像 js 隐式转换,真的太爽了~ 逐渐学习过程,不断提升强类型设计精髓理解。

92730

【DB笔试面试800】Oracle,归档和归档模式之间不同点是什么?它们各自优缺点是什么

♣ 题目部分 Oracle,归档和归档模式之间不同点是什么?它们各自优缺点是什么? ♣ 答案部分 Oracle数据库,数据库可以设置为归档模式归档模式。...归档模式则相反,不能恢复到任意一个时间点,但是非归档模式可以带来数据库性能上少许提高,因为归档模式没有归档日志。...DBA必须做出一个重要决策是将数据库配置为ARCHIVELOG模式下运行还是将其配置为NOARCHIVELOG模式下运行。。...4)当执行数据库备份时,必须备份数据库所有数据文件和控制文件。 归档和归档模式有以下几点区别: l NOARCHIVELOG模式下,每次进行日志切换时都会覆盖联机重做日志文件。...l 大多数情况下,数据库处于NOARCHIVELOG模式(默认模式)时,只能恢复到最后一次备份时状态。该备份之后执行所有事务处理都会丢失。

1K30

ubuntu 14.04 install haskell

haskell是一种函数编程式语言,ghc是Glasgow Haskell Compiler简称,也是Haskell Platform基础....D make install sudo aptitude purge ghc 编辑.bashrc文件 PATH="/usr/local/ghc/bin:$PATH" source ~/.bashrc ghci...cabal-install是另一个Haskell包安装库,提供了cabal命令行程序,该程序安装新包时会自动解决包依赖关系。...包含这些包,但是由于使用apt-get安装时不能获得最新版本或者会出现一些问题,比如network-2.6.0.2通过cabal总是安装不上,报编译错误 这种使用源码安装方式很好解决了这些问题。...安装相关haskell时候可能会出现broken package错误,可以通过以下命令haskell移除broken package ghc-pkg check --simple-output

69810

模块_Haskell笔记2

,支持GHCi环境直接使用import语法: > import qualified Data.Map as M > M.fromList [('a', 1)] fromList [('a',1)] 所以...,不用关注环境区别,具体见import qualified in GHCI 二.声明 模块用来组织代码,比如把功能相近函数放到同一个模块 例如二叉树模块定义: module BTree -- 声明要暴露出去函数及数据类型...或者不暴露值构造器,仅允许通过工厂方法等方式获取该类型值(常见比如Map.fromList): module MyModule (Tree, factory) 缺点是,这样做就无法使用值构造器进行模式匹配了...到集合这变成Set.intersection了 Map很多函数Set里也有对应版本,例如null, size, member, empty, singleton, insert, delete,...data type pattern matching:模式匹配自定义数据类型

1.7K30

从 Java 和 JavaScript 来学习 Haskell 和 Groovy(类型系统)

数据类型 Java ,有一些是非类对象原语类型,具体说就是 int、float、double、long、boolean,这也是 Java“不够面向对象” 一方面;其他类型,都可以归为 “类”...再看 Haskell ghci 中使用 :t 可以输出类型: :t "" // :: [Char] :t 'a' // :: Char :t 3 // :: Num a => a... Java、C++这样静态语言中,函数只能被声明和调用,只能依附在类定义上面,无法像对象一样被传来传去,为此还孕育了一堆设计模式,看起来高大上了,其实是无奈为之。...值得一提还有: 方法重载从编译时到运行时:方法重载选择静态语言里面全部都是编译期确定,编译期认为参数类型是什么是什么,这是在编译期间就已经明确事情(参阅 《画圆画方故事》,有一个很明确例子...这和 SQL select 1 from xxx 再求和写法没啥区别嘛。 2、模式匹配。这大概是 Haskell 我最喜欢部分。模式匹配在函数定义里面使用起来简直太漂亮了。

52050

从惰性IO说起_Haskell笔记6

一.惰性I/O与buffer Haskell,I/O也是惰性,例如: readThisFile = withFile "....不得不计算(求值)时候,比如上例==判断时候: instance (Eq a) => Eq [a] where {-# SPECIALISE instance Eq [Char] #-} [...所以,为了解决这个问题,就像引入foldl严格版本(惰性版本)foldl'一样,我们引入了ByteString P.S.上面提到“承诺”,其实在Haskell有个对应术语叫thunk ByteString...实现改成了类似于字符串字面量形式,看不出来差异了,具体见Haskell: Does ghci show “Chunk .....generator,还会重置global generator 五.异常处理 直到此刻,我们见过许多异常了(模式匹配遗漏、缺少类型声明、空数组取首元、除零异常等),知道一旦发生异常,程序就会立刻报错退出

2.3K30

铁定不纯IO_Haskell笔记5

写在前面 一直有个疑惑,Haskell号称纯函数式语言,那么铁定不纯场景(肯定有副作用,或者操作本身就是副作用)如何解决?...放到do语句块里 GHCi环境输入I/O Action再回车,如putStrLn "hoho" 执行 可以把main当做普通函数GHCi环境下执行,例如: > :l echo [1 of 1] Compiling...惰性I/O 字符串本身是一个惰性List,getContents也是惰性I/O,不会一次性读入内容放到内存 toUpperCase'示例中会一行一行读入再输出大写版本,因为只输出时候才真正需要这些输入数据...,做事情无非两种: 抽象出通用模式,包括Maybe/Either等类型抽象,forever do, interact等常用模式抽象 简化关键逻辑之外部分,比如withFile,map, filter...Handle) -- 定义System.Directory模块,用来删除指定文件 removeFile :: FilePath -> IO () -- 定义System.Directory模块

1.3K30

怎样写解释器

每一个分支由两部分组成,左边是一个“模式”,右边是一个结果。左边模式匹配之后可能会绑定一些变量,它们可以右边表达式里面使用。...“你所有的情况,我都能处理”,这就是“穷举法”。穷举思想非常重要,你漏掉任何一种情况,都非常有可能带来麻烦。所谓“数学归纳法”,就是这种穷举自然数递归定义上面的表现。...比如 '(,op ,e1 ,e2) 就是一个模式(pattern),它被用来匹配输入 exp。模式匹配基本原理就是匹配与它“结构相同”数据。...它非常简单,就是环境查找变量值。这里 (? symbol? x) 是一个特殊模式,它使用 Scheme 函数 symbol?...如果你用一个函数式数据结构,绑定参数时不生成新环境,而是对已有环境进行赋值,那么这 个赋值操作就会永久性改变原来环境内容。所以你函数返回之后必须删除参数绑定。

1.6K70

Java 新特性前瞻:封印类

某些情况下,编译器可以为我们推断出 permits 子句)。任何其他尝试扩展 Shape 类或接口都将收到编译错误(如果你试图通过其他方式生成 Shape 子类,会在运行时出现错误)。...求和类型和封印类并不是什么新生事物,Scala 也有封印类,Haskell 和 ML 有用于定义求和类型原语,有时候也被叫作标记联合(tagged union)或区分联合(discriminated...Javadoc 工具在生成文档页面列出了封印类允许子类型。 Java SE 14 引入了一种有限定 模式匹配未来会进一步扩展。...但将 final 类变成 sealed,不管是二进制还是源代码方面都是不兼容封印类添加新允许子类型是二进制兼容,但不是源代码兼容 (这可能会破坏 switch 表达式穷举性)。...封印类是对记录类自然补充,因为它们一起形成了代数数据类型。它们也很适合用于模式匹配。Java 也很快会带来模式匹配

57710

为什么 Haskell 是我们构建生产软件系统首选

这并不是说上面这些都是 Haskell 永远不需要回答问题;这里说是当你需要解决其中一个问题时,编译器会抛出一个错误。...它是一个简单命令行工具,依赖 Haskell REPL 来自动监视代码更改并进行增量重编译。将更改保存到文件后,我们可以立即查看代码任何编译器错误。...++ show invoiceNumber Canceled -> "Invoice #" ++ show invoiceNumber ++ " has been cancelled" 上面的函数使用模式匹配...编译器抛出一个错误,并告诉我们 case 语句在其模式匹配不处理 Refunded 值。 编译器会根据类型对域建模,从而帮助我们确保所有域逻辑都可以处理域中所有可能值 *。...这意味着 SQL 程序倾向于描述其执行结果应该是什么,而不是这个结果如何实现。熟悉 SQL 开发人员都能想得到,以命令式方式编写代码来检索表存储为一系列行数据会非常麻烦。

1.3K10

从 Java 和 JavaScript 来学习 Haskell 和 Groovy(汇总)

下面这张 “神图” 来自于这里,可以说是对于范型和语言归类概览,从左往右从更强声明式向着更弱声明式发展;依据状态分为 Unnamed state(串行或并发,包含逻辑式和函数式这几种分类)、Nondet...擅长表现面向对象范型,限制也很多,不容易搞破坏,但是讽刺是,它本身却存在对象原语类型,就是 int、float、double 等等这些东西,这个不足 Groovy 中被修复。...Groovy 包含 Java 一切包含东西,但是由于语言灵活,特别是动态语言特性,很多范型编程上面更有优势,比如面向切面编程。之前介绍过元编程, Groovy 里发扬光大。...《从 Java 和 JavaScript 来学习 Haskell 和 Groovy(DSL)》,介绍了这几门语言对于 DSL 实现常见模式和语法糖,比如 Java 链式调用和泛型传递,闭包和 Lambda...表达式,JavaScript 高阶函数,Groovy 对于 DSL 友好语法糖,Haskell 模式匹配和 List Comprehension,尾递归和惰性求值等等。

48910

当我们谈论Monad时候(二)

通过模式匹配和递归,不难写出对应lmap lmap :: (a -> b) -> List a -> List b lmap _ Nil = Nil lmap f (Cons x xs) = f x...那么Appliacative是什么呢?Applicative是对“应用”抽象,它允许容器“存放”一个函数。 还是用例子来说明。上一篇文章最后,我举了一个多参函数例子。...b 实现Applicative 实现Applicative方法和fmap大同小异,唯一区别就是还需要对函数进行模式匹配。...而就是对函数与值都进行模式匹配,在有值情况下将值应用给函数。 对于列表来说,情况可能稍微复杂一点。因为参数可能是多个函数和多个值。...至于这个定律是什么讲原理文章我会详细说明。

77810

函数式编程与面向对象编程: 静态类型语言表达力 静态类型语言与动态类型语言函数式编程与面向对象编程: 静态类型语言表达力 静态类型语言与动态类型语言

1.1 优点 静态类型语言主要优点在于其结构非常规范,便于调试,方便类型安全 现在有这样一种趋势,那就是合并动态类型与静态类型一种语言中,这样可以必要时候取长补短(下面第4节:Scala语言特色时介绍...5 Haskell, Go, Scala 5.1 Haskell 他虽然很老但是一直是作为学院派函数式语言代表,其纯函数式特性和简洁漂亮语法(糖)让人看了非常舒服,接触了面向过程和面向对象开发后...语言本身很多写法也跟数学定义很接近,比如定义一个集合 ghci> [x*2 | x <- [1..10]] [2,4,6,8,10,12,14,16,18,20] 看起来很像数学定义,语言可谓优雅漂亮...作为学院派语言,语言自身设计要求不可谓不严格,完美的阐述了函数式是什么意思,但是语言复杂度较高,学习曲线很陡峭,很难保证团队成员接收程度,也很难招到相关技术人才。...同时函数式不那么擅长领域Haskell商业化程度很低,我们不可能都用Haskell来写一些语法解释或者正则解析等,涉及IO分布式存储和计算都相对很初级,尤其是对于我们比较感兴趣数据挖掘机器学习领域没有成熟解决方案

1.4K10
领券