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

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

调试 目前 Haskell 主要编译器是 GHC,下载地址,你可以创建 .hs 文件,用 Notepad++ 打开。 GHCiGHC 一部分,可以解析、调试 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 类型属于强类型,即每一个数据或每一个函数都有非常精确、严格类型。

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

Haskell

本文不是入门教程,你可以阅读官网,本文主要写一写自己学习感受,并且告诉你一个初步运行环境。...通过官网,你可以下载到它运行环境,目前Haskell根据你不同场景需求,提供了几种安装包,最小尝试,我们可以从Minimal installers开始,你可以根据你操作系统平台来选择下载Core...这两种安装包,都包含了ghc。...ghc包含了三个主最要部分: ghc 编译ghci 交互式解析器和调试器 runghc 以脚本方式运行Haskell 而我们即将学习起点就是在ghci中来练习Haskell基本语法。...在终端输入ghci进入交互式界面: Prelude> 1+(-1) = 0 据说“命令式属于工程师”,“函数式属于科学家”,这门语言还有哲学层面的东西。

81930

newtype_Haskell笔记8

不像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 而下面这种形式就不会被计算...关键字定义数据类型可以有多个值构造器,即便只声明了一个,它也要找过才知道。

59330

模块_Haskell笔记2

可以通过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

1.7K30

从惰性IO说起_Haskell笔记6

会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指的是可以指定宽度无符号整型

2.3K30

基础语法_Haskell笔记1

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,且不包括同名函数其它模式 子句中可以用模式匹配 允许嵌套使用

1.8K30

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

我们不能喂给他 Maybe Pole 东西。...他原则是简单明了,把 monadic value 串成一串。我们这边来细看 do 是如何使用,以及为什么我们十分倚赖他。...ghci> (6,2) `canReachIn3` (7,3) False 答案是不行。你可以修改函数改成当可以走到时候,他还会告诉你实际步骤。之后你也可以改成不只限定成三步,可以任意步。...m >>= return 会等于 m 这一个可能不像第一定律那么明显,但我们还是来看看为什么会遵守这条。...如果我们有一个函数他型态是 a -> m b,我们并不能直接把结果丢给另一个型态为 b -> m c 函数,因为后者只接受型态为 b 普通值。然而,我们可以用 >>= 来做到我们想要事。

97620

VMware Linux下拖拽补丁vmtools安装和卸载

步骤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 #这一步只能在本机上执行,不能通过类似

3.7K30

Pandoc安装实现Markdown转PDF (CentOS6)

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非常强大,可以对几乎所有的文档格式进行互转,比如

2.2K60

MySQL主从复制详解

1.MySQL主从复制主要用途:  读写分     在开发工作中,有时候会遇见某个SQL语句需要锁表,导致暂时不能使用读服务,这样会影响现有业务,使用主从复制,让主库负责写,从库负责读,这样,即使主库出现了锁表情况...,通过读从库也可以保障业务正常运作。...,并将新binlog文件名和位置记录到master-info文件中,以便下一次读取master端新binlog日志时能告诉Slave服务器从新binlog日志指定文件及指定位置开始读取新binlog...(2)MySQL复制数据粒度可以是主实例上所有的数据库,也可以是指定一个或多个数据库,也可以是一个数据库里指定表。...为什么失败了?原来是从MySQL-Slave-relay-bin.index文件中找不到slavejmy-relay-bin.000005文件

2.2K30

Heskell与函数式编程

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

78570

类型_Haskell笔记3

二.变量类型 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],从而给类型声明带来语义上好处,例如

88940

Online DDL 工具 gh-ost实战(一)

–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

1.9K30

技术分享 | 实测在 after_sync 中使用 gh-ost是如何丢数据

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秒多,这次数据并没有丢失,看来修复方案有效

91630

热爱函数式你,句句纯正 Haskell【表达式篇】

先看个小例子感受一下(依然是借助编译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,对于平常编程思考也是大有裨益,希望你有受用到

1K30

泛型和元编程模型:Java, Go, Rust, Swift, D等

这种方式虽然被Haskell类型类使用,但GHCGHC是Haskell编译器)通过内联和特殊化,也可以做单态化优化。...使用宏就可以直接将用户写代码以token形式从输入粘贴到输出,如果用户代码在宏输出中引起编译器错误,编译器输出错误信息将正确地指向用户代码所在文件、行和列,但如果宏生成了错误,那么错误信息将指向宏调用...,这也是为什么Rust可以使用同一个类型系统来支持这两种泛型原因!...这一方式也让Swift编译器和HaskellGHC编译器即使默认使用装箱来实现泛型,也可以单态化作为优化手段。 机器码单态化 单态化泛型下一步是在编译器后端中进一步推进。...其缺点是每个单态化副本不能被优化器特别优化,然而因为没有重复优化,所以编译速度可以快很多。

3K30

gh-ost 原理剖析

而且binlog是基于dml 操作产生,因此对影子表apply binlog 一定在 对原表dml之后,共有如下几种顺序: ? 通过上面的几种组合操作分析,我们可以看到 数据最终是一致。...9 c10 执行UNLOCK TABLES; 此时c20rename命令第一个被执行。而其他会话c1-c9,c11-c19,c21-c29请求可以操作新表b。...大家可以一边自己执行gh-ost ,一边开启general log 查看具体操作过程。...如果c10加锁语句失败,gh-ost 程序退出,因为表还未被锁定,dml请求可以正常进行。...对复制影响 slave因为binlog文件中不会复制lock语句,只能应用rename 语句进行原子操作,对复制无损。 7 处理收尾工作 最后一部分操作其实和具体参数有一定关系。

2K40
领券