文件 PATH="/usr/local/ghc/bin:$PATH" source ~/.bashrc ghci #验证是否安装成功 sudo aptitude purge ghc Cabal是Haskell...安装了cabal-install就可以了,因为cabal-install依赖与cabal,安装程序会自动下载cabal并安装。...PATH=$HOME/.cabal/bin:$PATH source ~/.bashrc cabal update 安装包haskell-platform中包含这些包,但是由于使用apt-get安装时不能获得最新的版本或者会出现一些问题...,比如network-2.6.0.2通过cabal总是安装不上,报编译错误 这种使用源码安装的方式很好的解决了这些问题。...在安装相关haskell包的时候可能会出现broken package错误,可以通过以下命令在haskell中移除broken package ghc-pkg check --simple-output
调试 目前 Haskell 的主要编译器是 GHC,下载地址,你可以创建 .hs 文件,用 Notepad++ 打开。 GHCi 是 GHC 的一部分,可以解析、调试 Haskell 程序。...认识下 GHCi 中的命令: :l 用来导入当前路径或者指定路径下的文件; Prelude> :l "C:\\Users\\ User\\Desktop\\HelloWorld\\HelloWorld.hs..." :r 用来重新导入当前的源代码文件; :cd 改变当前GHCi的路径; Prelude> :cd C:\Users\User\Desktop :edit 用默认的文本编辑器编辑当前导入的文件...也可以新建一个文件:Helloworld.hs 然后 :l 引入,输入 main 运行: Prelude> :l D://ghc-haskell//test.hs *Main> main Hello,...也可以通过 :cd 命令,输入 runghc ,将 .hs 文件变成 .exe 文件执行; 类型 Haskell 的类型属于强类型,即每一个数据或每一个函数都有非常精确、严格的类型。
本文不是入门教程,你可以阅读官网,本文主要写一写自己的学习的感受,并且告诉你一个初步的运行环境。...通过官网,你可以下载到它的运行环境,目前Haskell根据你不同的场景需求,提供了几种安装包,最小的尝试,我们可以从Minimal installers开始,你可以根据你的操作系统平台来选择下载Core...这两种安装包,都包含了ghc。...ghc包含了三个主最要的部分: ghc 编译器 ghci 交互式解析器和调试器 runghc 以脚本的方式运行Haskell 而我们即将学习的起点就是在ghci中来练习Haskell的基本语法。...在终端输入ghci进入交互式界面: Prelude> 1+(-1) = 0 据说“命令式属于工程师”,“函数式属于科学家”,这门语言还有哲学层面的东西。
(GHC.Prim.State# GHC.Prim.RealWorld -> (# GHC.Prim.State# GHC.Prim.RealWorld, a #))...环境输入I/O Action再回车,如putStrLn "hoho" 执行 可以把main当做普通函数在GHCi环境下执行,例如: > :l echo [1 of 1] Compiling Main...输入空行会退出,输入其它内容会按行原样输出 也可以编译得到可执行文件: $ ghc --make ....但如果编译执行该函数,会发现是逐行处理的: $ ./toUpperCase abc ABC efd EFD 这与输入缓冲区有关,具体见Haskell: How getContents works?...-- Defined in ‘GHC.IO.IOMode’ P.S.可以把文件指针当做书签来理解,书指的是整个文件系统,这个比喻非常形象 withFile withFile :: FilePath ->
不像type创建的别名类型可以与原类型等价换用,newtype创建的新类型与原类型是完全不同的东西,唯一的联系是新类型内部实际操作的是原类型(通过持有原类型实例引用),通过这种方式在外层实现对原类型的扩展...type 给现有类型起别名,得到的东西完全等价于原类型,可无条件换用/混用 想让类型签名更清楚(语义化)的时候 newtype 将现有的类型包成一个新的类型,得到的类型与原类型不同,不能换用/混用 想让现有类型具有一种不同的接口...:79:14 in base:GHC.Err undefined, called at :12:1 in interactive:Ghci1 能够用来检验惰性(计算到底执行了没.../Err.hs:79:14 in base:GHC.Err undefined, called at :37:10 in interactive:Ghci17 而下面这种形式的就不会被计算...关键字定义的数据类型可以有多个值构造器,即便只声明了一个,它也要找过才知道。
,可以通过qualified保留命名空间来避免冲突 GHCi环境 通过:m命令引用模块: > :m Data.List > :m Data.List Data.Map Data.Set GHC 7.0之后...,不用关注环境区别,具体见import qualified in GHCI 二.声明 模块用来组织代码,比如把功能相近的函数放到同一个模块中 例如二叉树的模块定义: module BTree -- 声明要暴露出去的函数及数据类型...,所以对应的文件名应为BTree.hs 模块声明必须位于首行(之前不能有import之类的东西,import可以放在where之后) 模块中数据结构的导出与import语法类似: module MyModule...Vector.hs 包名要求首字母大写(Math),子模块文件名要与子模块名保持一致,大小写敏感性与环境有关(比如OSX不敏感) 三.标准库模块 标准库内置了很多强大的函数,可以通过Hoogle查看用法示例...所以 (==) `on` compare `on` 都是非常棒的惯用套路 P.S.可以通过:browse 命令查看模块中的所有函数及数据类型定义的类型声明 Data.Char String
会show出类似于上面的差异,0.10.0.1之后的Show实现改成了类似于字符串字面量的形式,看不出来差异了,具体见Haskell: Does ghci show “Chunk .....,所以可以先用String实现,在性能不好的场景再改成ByteString P.S.更多ByteString相关函数,见Data.ByteString 三.命令行参数 除交互输入和读文件外,命令行参数是另一种获取用户输入的重要方式...make sourceFile编译执行外,还有一种直接run源码的方式: $ runhaskell testArgs.hs -b -c /absolute/path/to/ghc-8.0.1/bin/ghc...NODE_ENV production testArgs.hs -b -c 此时getExecutablePath返回的是ghc(可执行文件)的绝对路径 四.随机数 除了I/O,另一个铁定不纯的场景就是随机数了...{-# UNPACK #-}GHC.Int.Int32 -- Defined in ‘System.Random’ P.S.其中Word指的是可以指定宽度的无符号整型
same infix expression 二元运算符和一元运算符不能混用在同一个中缀表达式里,这会带来解析时的不确定性(有歧义,编译器不知道该怎样理解)。...在GHCi环境可以通过info:命令查看运算符优先级,例如: > :i * class Num a where ... (*) :: a -> a -> a ... -- Defined...,=后面是函数体 2个特点: 声明顺序无所谓 函数名首字母不能大写,不能数字开头 P.S.数学里把相似的东西用x x' x''的命名习惯表示,在Haskell里也可以这样做: y x = x ^ 2 y...:: Bool -- Defined in ‘GHC.Base’ > otherwise == True True 所以otherwise只是语义需要,直接用True作为默认分支的条件也可以 P.S...: 多行声明必须对齐缩进,否则编译器无法正确解析(不知道要定义的变量/函数列表结束了没) 子句中声明的变量和函数的作用域是当前函数及其guard,且不包括同名函数的其它模式 子句中可以用模式匹配 允许嵌套使用
我们不能喂给他 Maybe Pole 的东西。...他的原则是简单明了,把 monadic value 串成一串。我们这边来细看 do 是如何使用,以及为什么我们十分倚赖他。...ghci> (6,2) `canReachIn3` (7,3) False 答案是不行。你可以修改函数改成当可以走到的时候,他还会告诉你实际的步骤。之后你也可以改成不只限定成三步,可以任意步。...m >>= return 会等于 m 这一个可能不像第一定律那么明显,但我们还是来看看为什么会遵守这条。...如果我们有一个函数他的型态是 a -> m b,我们并不能直接把结果丢给另一个型态为 b -> m c 的函数,因为后者只接受型态为 b 的普通值。然而,我们可以用 >>= 来做到我们想要的事。
步骤2、查看要安装的Tools镜像文件(一般为linux.iso),连接光驱 ? ? 步骤3、查看是否挂载 [root@localhost ~]# mount ......# cd /mnt/ [root@localhost mnt]# ls ls: reading directory .: Input/output error #如上,提示错误(估计是没卸载之前的已经加载的光盘导致...-8.8.4-743747.tar.gz 步骤5、解压安装文件【建议新建一个临时目录,用完后可以直接删除该临时目录】 [root@localhost cdrom]# mkdir /tmp/temp...-8.8.4-743747.tar.gz 步骤6、进入工具目录,并安装 [root@localhost temp]# cd vmware-tools-distrib/ [root@localhost...[root@localhost vmware-tools-distrib]# /usr/bin/vmware-user 2).启动Xwindow # startx #这一步只能在本机上执行,不能通过类似
ghc是haskell的编译器,cabal是一种包管理器,可以很方便的自动安装各种包和依赖,pandoc就是使用cabal来安装的,TeX是一种文档排版系统,texlive是like unix下的一种TeX...修改bootstrap.sh文件中的 HACKAGE_URL="https://hackage.haskell.org/package" 为 HACKAGE_URL="http://mirrors.nju.edu.cn...执行cabal update,待出现如下提示后,执行Ctrl+C中断命令,还是由于haskell官方源网络比较慢,修改生成的配置文件中源的地址为南京大学的镜像站 $ cabal update Config...这样pandoc命令就可以找到。...,这个字体在Centos上须要先安装好 -V geometry:margin=1in 指定上下左右的空白尺寸 -o 指定输出文件名 总结 pandoc非常的强大,可以对几乎所有的文档格式进行互转,比如
1.MySQL主从复制主要用途: 读写分 在开发工作中,有时候会遇见某个SQL语句需要锁表,导致暂时不能使用读的服务,这样会影响现有业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表的情况...,通过读从库也可以保障业务的正常运作。...,并将新的binlog文件名和位置记录到master-info文件中,以便下一次读取master端新binlog日志时能告诉Slave服务器从新的binlog日志的指定文件及指定位置开始读取新的binlog...(2)MySQL复制的数据粒度可以是主实例上所有的数据库,也可以是指定的一个或多个数据库,也可以是一个数据库里的指定的表。...为什么失败了?原来是从MySQL-Slave-relay-bin.index文件中找不到slavejmy-relay-bin.000005文件。
编写第一个Haskell 编写Haskell之前需要把Haskell Platform下载下来(https://www.haskell.org/platform/),安装后使用ghci就可以进行Haskell...我的电脑是Windows,在Windows下打开cmd,输入ghci,就能进入编程界面,在这个界面能够进行简单的编码,比如下面: ? 这里简单的进行了一次 3+5的求和操作。...写完保存成文件(这里保存为cal.hs),以.hs作为后缀,在对应目录的命令行下面输入 :l 文件名 ? 调用自定义的函数findMax,输入参数1 3,然后就能够看到输出最大值3了。...类型和函数 Haskell是静态类型,也就是编译器在编译过程中就能够明确每个值的类型,当发现类型不匹配的时候,在编译过程中就会报错。比如输入这样一个函数: ?...== 是个表达式,编译的时候会进行1和”2“的类型判断,1是Int类型,”2“是[Char]类型,因此会报编译错误。 ?
二.变量类型 name :: String name = "ayqy" ::读作“类型为”(has type),告诉编译器变量name是String类型(即[Char]类型)的 另外,类型的首字母都是大写的...P.S.虽然理论上很多场景不需要手动注明类型(编译器会自己推断),但实践建议是至少给顶层变量/函数都标明类型,当然,全都标上肯定是好习惯,毕竟明确的类型能够大大增强可读性,具体见Type signatures...GHCi环境直接输出(因为输出前调用show :: Show a => a -> String),所以,让Shape成为Show的成员: data Shape = Circle Float Float...类型参数 类型构造器可以传入参数,返回新的类型。...type String = [Char] -- Defined in ‘GHC.Base’ 通过type关键字给类型定义别名,让String等价于[Char],从而给类型声明带来语义上的好处,例如
I/O Action类容器特殊之处在于,容器里的值是不确定的,取决于外部输入,可能来自用户键入、文件读取、甚至直接从系统环境取(比如随机数种子)。...(.) :: (b -> c) -> (a -> b) -> a -> c 所以,函数也是Functor类实例 P.S.那么,((->) r)为什么长得这么奇怪?...(a -> b) -- 得到一根(更长的)新试管ac,作用是把水变蓝 a -> c 为什么比作试管(或者生化盒子)?因为代指一种转换,想要表达变化。...而使用跟我们可以将普通的函数来运作在任意数量的applicative functors上。...,并将他升级成一个函数可以运作在两个functor之上 这就是所谓的lifting(升级?)
–assume-rbr:确认gh-ost连接的数据库实例的binlog_format=ROW的情况下,可以指定-assume-rbr,这样可以禁止从库上运行stop slave,start slave,...该参数可以用在多个gh-ost同时操作的时候,创建一个文件,让所有的gh-ost操作停止,或者删除这个文件,让所有的gh-ost操作恢复。...文件用来监听请求,比如可以动态调整性能方面参数,也可以进行暂停、恢复gh-ost线程。...Aborting without cleanup 注意:停止gh-ost操作会有遗留表 xxx_ghc, xxx_gho 还有socket文件,管理cut-over的文件,如果你需要执行两次请务必检查指定目录是否存在这些文件...问题 2、修改对象表不能被触发器关联,gh-ost 虽然不再依赖触发器,但是依然不支持有触发器关联的表,如果修改有触发器关联的表,则会有如下提示: 2019-12-07 22:44:01 ERROR Found
gh-ost 安装很简单,官方提供了编译脚本,只需执行 master 目录下的 build.sh 即可,执行后会自动在 /tmp 下生成 gh-ost-release 目录,包括可执行二进制文件、二进制...,比如120000,即120s),为什么要设置大于 60s 呢?...),在获取原表数据时的取值范围是[1]..[1],id=2的新值(最大值)没有被获取到,为什么呢?...的,且包含 Xid ,而此时的 redo log 中,该事务仍然没有被“封口”,不能返回 ok 给客户端 由于主库配置的半同步超时时间大于gh-ost获取原表首尾记录临界值的开始时间(120s > 60s.../gh-ost-master/go/logic/migrator.go 文件 重新编译 gh-ost 后再次验证,同样是采用之前的配置,事务执行了1分53秒多,这次数据并没有丢失,看来修复方案有效
先看个小例子感受一下(依然是借助编译器 GHC): Prelude> isTwo n = if n==2 then True else False Prelude> isTwo 2 True Prelude...是一个函数,n 是入参;可以看到,Haskell 的表达式并没有像在 JS 中的括号进行包裹; 当然,你也可以写像 JS 中的等号运算符; Prelude> isFive = (==5) Prelude...实际上,if..then..else 是一种结构性的表达式,也可以理解为一种运算符,属于:混合位置运算符; 而普通的加法,处于两个参数中间,称为:中缀运算符; 函数,位于一个参数前面,可理解为:前缀运算符...可以在 GHC 控制台打印类型看看: Prelude> :t (+) (+) :: Num a => a -> a -> a Prelude> :t (-) (-) :: Num a => a -> a...、$ 等; 这些都是为后面揭开 Haskell 函数式编程神秘面纱的基础,期间也能一窥这种把函数当计算的奇妙之处,即使不能在开发生产中用到 Haskell,对于平常的编程思考也是大有裨益的,希望你有受用到
这种方式虽然被Haskell类型类使用,但GHC(GHC是Haskell编译器)通过内联和特殊化,也可以做单态化优化。...使用宏就可以直接将用户写的代码以token的形式从输入粘贴到输出,如果用户的代码在宏输出中引起编译器错误,编译器输出的错误信息将正确地指向用户代码所在的文件、行和列,但如果宏生成了错误,那么错误信息将指向宏调用...,这也是为什么Rust可以使用同一个类型系统来支持这两种泛型的原因!...这一方式也让Swift的编译器和Haskell的GHC等编译器即使默认使用装箱来实现泛型,也可以单态化作为优化手段。 机器码单态化 单态化泛型的下一步是在编译器后端中进一步推进。...其缺点是每个单态化的副本不能被优化器特别优化,然而因为没有重复优化,所以编译速度可以快很多。
而且binlog是基于dml 操作产生的,因此对影子表的apply binlog 一定在 对原表的dml之后,共有如下几种顺序: ? 通过上面的几种组合操作的分析,我们可以看到 数据最终是一致的。...9 c10 执行UNLOCK TABLES; 此时c20的rename命令第一个被执行。而其他会话c1-c9,c11-c19,c21-c29的请求可以操作新的表b。...大家可以一边自己执行gh-ost ,一边开启general log 查看具体的操作过程。...如果c10的加锁语句失败,gh-ost 程序退出,因为表还未被锁定,dml请求可以正常进行。...对复制的影响 slave因为binlog文件中不会复制lock语句,只能应用rename 语句进行原子操作,对复制无损。 7 处理收尾工作 最后一部分操作其实和具体参数有一定关系。
领取专属 10元无门槛券
手把手带您无忧上云