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

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

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

1.1K20

基础语法_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.9K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Haskell

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

    88330

    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 特殊地,函数调用时的模式匹配本身是需要计算的

    62130

    热爱函数式的你,句句纯正的 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 中的隐式转换,真的太爽了~ 在逐渐学习的过程中,不断提升强类型设计精髓的理解。

    97130

    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]类型,因此会报编译错误。 ?

    85370

    Haskell 自定义type与typeclass

    部分类似于OOP中的class,上文中的值构造器类似于class的构造方法,Book可以认为是构造方法的方法名,java等一些语言中构造方法是与class是同名的,但是Haskell中很明显没有这种约束...5 :-: Empty ghci> 100 :-: a (:-:) 100 ((:-:) 3 ((:-:) 4 ((:-:) 5 Empty))) haskell在deriving Show的时候仍然会视值构造器为前缀函数...我们可以在很多地方加上类型约束,这里就是在class Num where 中的a上加上它必须是Eq instance的约束。...可以在 ghci 中输入 :info YourTypeClass。所以输入 :info Num 会告诉你这个 typeclass 定义了哪些函数,还有哪些类型属于这个 typeclass。...但类型也有自己的标签,叫做kind,kind是类型的类型。 我们可以在ghci中通过:k来获取一个类型的kind: Prelude> :k Int Int :: * *代表这个类型是具体类型。

    7710

    Haskell Type与Typeclass

    Type ghci中可以用:t检测表达式的类型 Prelude> :t "a" "a" :: [Char] 函数也有类型,编写函数时给一个明确的类型声明是一个好习惯 removeNonUppercase...> tip: 按照其他语言中的习惯,Int,Int,Int -> Int好像看起来更为恰当一些,但实际haskell中->只有一个作用:它标识一个函数接收一个参数并返回一个值,其中->符号左边是参数的类型...,那它是什么呢,它实际上是一个类型变量,a可以是任意类型。...tip: 跟OOP中的接口很像 以==函数的类型声明为例: Prelude> :t (==) (==) :: Eq a => a -> a -> Bool 这里的Eq就是typeclass, 这里意思是说...class elem函数的类型为:(Eq a)=>a->[a]->Bool这是因为elem函数在判断元素是否存在于list中时使用到了==的原因。

    7310

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

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

    1.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

    72910

    模块_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 中我最喜欢的部分。模式匹配在函数的定义里面使用起来简直太漂亮了。

    55150

    从惰性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

    Haskell 函数语法

    版本ghci中如果按照书中的写法是会报没有匹配项的错误的,按照let { … } 写法则没有问题 在调用lucky时,模式会从上到下进行检查,一旦有匹配则对应的函数体便被应用。...如果我们制定的匹配模式不全时,传入一个没有被任何模式匹配到的参数时就会报错。...let中绑定的名字仅在in中可见,let中的名字必须对齐在一列。 let是个表达式,而where是个语法结构。...不过,把一个 let…in 放到限制条件中也是可以的,这样名字只对这个限制条件可见。在 ghci 中 in 部分也可以省略,名字的定义就在整个交互中可见。...expression匹配符合的模式,如果符合则执行。实际上上面的模式匹配是case的语法糖而已。

    8710

    铁定不纯的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 也很快会带来模式匹配。

    60910
    领券