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

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

我们从 wiki 上可以找到以下要点: Haskell 是一种标准化的,通用的纯函数式编程语言,惰性求值和强静态类型; 在Haskell中,“函数是第一类对象”。...调试 目前 Haskell 的主要编译器是 GHC,下载地址,你可以创建 .hs 文件,用 Notepad++ 打开。 GHCi 是 GHC 的一部分,可以解析、调试 Haskell 程序。...&&False not True Char 字符型,与其它语言一致 Prelude> :t "str" "str" :: [Char] Int 符号整数,它的范围与操作系统和 GHC...但是,它还可以是一个任意精度整数,或是一个小数。...可以看出,Haskell 的严格定义类型和 javaScript 中还是较大差异,一个强类型,一个弱类型~ 强类型适合大型项目的维护,弱类型与动态性结合,开发简单,处理灵活; Haskell 的类型类

93330

Pandoc安装实现Markdown转PDF (CentOS6)

官方网址:https://pandoc.org/ Pandoc安装 由于Centos6的yum源中haskell相关的版本都比较老了,所有须要自行源码安装,须要安装的内容ghc, cabal, pandoc...ghchaskell的编译器,cabal是一种包管理器,可以很方便的自动安装各种包和依赖,pandoc就是使用cabal来安装的,TeX是一种文档排版系统,texlive是like unix下的一种TeX...ghc安装 pandoc官方文档提到: Note that pandoc requires GHC >= 7.8....所以我下载安装7.8.2, 下载安装源码包 $ wget http://www.haskell.org/ghc/dist/7.8.2/ghc-7.8.2-x86_64-unknown-linux-centos65...另外本文介绍在CentOS操作系统上比较合适的安装方式,其他的比如Ubuntu上可能有更好的更方便的安装方式,请参考Pandoc官方文档http://pandoc.org/installing.html

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

从惰性IO说起_Haskell笔记6

) 通过模式匹配从左向右遍历对比元素是否相等,每次取List首元,此时才真正需要List,才被“创造”出来 用非惰性的JS来描述就像这样: function unshift(x, xs) { return...return true; return s.value == a.value && eq(s.tail(), a.tail()); }// test eq(str, charList); 用“懒”链表来模拟在真正需要的时候才去创造的...所以,为了解决这个问题,就像引入foldl的严格版本(非惰性版本)foldl'一样,我们引入了ByteString P.S.上面提到的“承诺”,其实在Haskell个对应的术语叫thunk ByteString..., init, null, length, map, reverse, foldl, foldr, concat, takeWhile, filter 所以先要避免命名冲突: -- 惰性ByteString...NODE_ENV production testArgs.hs -b -c 此时getExecutablePath返回的是ghc(可执行文件)的绝对路径 四.随机数 除了I/O,另一个铁定不纯的场景就是随机数了

2.3K30

newtype_Haskell笔记8

一.ZipList与List 在List场景,xs ys表示从左侧xs中取出函数作用于右侧ys中的每一项,两种实现方式: 笛卡尔积 拉链式的一一结对 分别对应[]和ZipList,例如: import...pure x = ZipList (repeat x) liftA2 f (ZipList xs) (ZipList ys) = ZipList (zipWith f xs ys) P.S.这里实现了...liftA2,而没有出现,是因为Applicative最小完整定义(minimal complete definition)约束: A minimal complete definition must...undefined, 3, undefined, undefined] 1 > let (a, _) = (1, undefined) in a + 1 2 特殊地,函数调用时的模式匹配本身是需要计算的,不管匹配结果是否需要用到...不知道,因为按照约定,data关键字定义的数据类型可以多个值构造器,即便声明了一个,它也要找过才知道。

59830

MySQL主从复制详解

另外,随着系统中业务访问量的增大,如果是单机部署数据库,就会导致I/O访问率过高,了主从复制,增加多个数据存储节点,将负载分布到多个从节点,降低单机I/O磁盘访问率,从而提高I/O性能。   2....Master服务器接收到来自Slave服务器的I/O线程的请求后,二进制转储I/O线程会根据Slave服务器的I/O线程请求的信息分批读取指定binlog日志文件指定位置之后的binlog日志信息,然后返回给...Slave端的I/O线程,返回信息中除了binlog日志内容外,还有在Master服务器端记录的新的binlog文件名称,以及在新的binlog中的下一个指定更新位置。...enabled: 2,500 repolist: 12,954 如果操作系统是最小化安装,那么为了避免后期缺少相关依赖包而造成的麻烦...MySQL复制两种方法 (1)传统方式       基于主库的bin-log将日志事件和事件位置复制到从库,从库再加以应用来达到主从同步的目的。

2.3K30

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

先看个小例子感受一下(依然是借助编译器 GHC): Prelude> isTwo n = if n==2 then True else False Prelude> isTwo 2 True Prelude...,也必须定义条件不成立的时候返回的值,并且两者返回的类型必须相同,这样一定程度上保证了函数定义的完整性。...可以在 GHC 控制台打印类型看看: Prelude> :t (+) (+) :: Num a => a -> a -> a Prelude> :t (-) (-) :: Num a => a -> a...-> a 只不过它们属于不同位置的运算符(前缀、中缀、后缀、混合位置); 实际上,运算符共有 3 个属性: 优先级(在 Haskell 中,十个优先级(0 ~ 9)); 结合性(分为左结合、右结合...、$ 等; 这些都是为后面揭开 Haskell 函数式编程神秘面纱的基础,期间也能一窥这种把函数当计算的奇妙之处,即使不能在开发生产中用到 Haskell,对于平常的编程思考也是大有裨益的,希望你受用到

1.1K30

铁定不纯的IO_Haskell笔记5

写在前面 一直个疑惑,Haskell号称纯函数式语言,那么铁定不纯的场景(肯定有副作用,或者操作本身就是副作用)如何解决?...IO a = GHC.Types.IO (GHC.Prim.State# GHC.Prim.RealWorld -> (# GHC.Prim.State# GHC.Prim.RealWorld...(IO a) -- Defined in ‘GHC.Base’ 从类型上看,IO与Maybe :: * -> *类似,都是接受一个具体类型参数,返回具体类型(比如IO ()) P.S.其中,newtype...另外,do语句块里的I/O Action会执行,所以do语句块2个作用: 可以多条语句,但最后要返回I/O Action 圈定不纯的环境,I/O Action能够在这个环境执行 类比JS,组合多条语句的功能类似于逗号运算符...其中FilePath就是String(给String定义的别名),IOMode是个枚举值(只读,写,追加,读写4种模式): > :i FilePath type FilePath = String

1.3K30

基础语法_Haskell笔记1

infixl 6] and prefix `-‘ [infixl 6] in the same infix expression 二元运算符和一元运算符不能混用在同一个中缀表达式里,这会带来解析时的不确定性(歧义...函数默认都是柯里化的,都接受一个参数: In Haskell, all functions are considered curried: That is, all functions in Haskell...可以充分利用柯里化、List Comprehension等特性: map (+1) [1, 2, 3] [ x + y | [x, y] <- [[1, 1], [2, 2], [3, 3]]] 另外,个有趣的东西...调用函数时会按声明顺序匹配参数类型,所以上面的sayOneTwoThree 2返回"Not between 1 and 3" 再比如利用模式匹配递归求阶乘: fact 0 = 1 fact n =...mod10 2 *** Exception: t.hs:(27,1)-(28,11): Non-exhaustive patterns in function mod10 提示mod10函数的模式定义遗漏

1.8K30

听君一席话,如听一席话,解释解释“惰性求值”~

传递的参数就是一个类似于包装成(_ -> (g x))的一个thunk; 然后在真正需要计算g x的时候才会调用这个thunk; 事实上这个thunk里面还包含一个boolean表示该thunk是否已经被计算过...(若已经被计算过,则还包含一个返回值),用来防止重复计算; 第一节示例的 JavaScript 的代码虽然是惰性求值的思想体现,但是其本身并不是惰性求值; 惰性求值是编程语言的特性设计,很多纯粹的函数式编程语言都支持这种设计...then result2 else result3 看上去,这和 JavaScript 示例代码 1 一样,但是它实际上实现的却是 JavaScript 示例代码 2 的效果; 在 GHC...,兴趣了解: strictness-points; What does seq actually do in Haskell?...(思路:强制求值第一个参数,返回第二个参数;) 函数式语言和命令式语言的内存模型; 懒惰奥义 听君一席话,如听一席话,希望看完本篇后,有人再问你“什么是惰性求值”,能心里个基本的谱~~ 人天性爱偷懒

58320

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

假设我们要检查一个元素是否在某个列表中。我们要找一个函数,这个函数需要一个要搜索的项目、一个项目列表并返回一个布尔值。我们不关心项目的类型,只要搜索项目和列表中的项目属于同一类型即可。...上面的示例很普通,但是高阶函数许多应用场景。例如,我们可以编写一个 renderPost 这样的函数,这个函数获取帖子数据的记录并返回以 HTML 渲染的帖子版本。...在 Haskell 中开发应用程序时,我们通常在一个窗格中打开一个带有文本编辑器的终端,然后在另一个窗格中打开 ghcid。...当使用动态类型的语言编写代码时经常会出现未处理值的错误,而 Haskell 就可以为我们避免这类错误。...在这种情况下,自动化测试不能代替类型,因为引入新的可能值通常需要更新测试以断言是否可以处理新值,这并不能帮助我们避免问题——我们很容易忘记更新业务逻辑是,所以也很容易忘记更新业务逻辑的测试。

1.3K10

当我们谈论Monad的时候(二)

Haskell中的IO函数都会返回一个IO Monad,而上面的代码中,我们并没有对每一条都使用之前的结果。对于部分IO Monad(如putStrLn返回的),我们直接就抛弃了这些返回值。...这其实是一个历史问题,而且只有GHC版本在7.10之后才有这个要求。...因此在2014年,Haskell社区提出了AMP将这些问题都做了统一,之后由GHC 7.10对相关提议做出了实现。...不过,这也解释了为什么如今Haskell的Applicative和Monad是这种状态。那么,是什么原因使Haskell冒着把标准库搞乱的风险也要引入Applicative呢?...而Monad的计算流程是可变的,这也意味着它的计算“上下文”。一般的计算场景中都是上下文的,比如IO运算。但是这种没有依赖的计算场景其实也是存在的,比如并发、Parser。

78510

5 门可能衰落的编程语言

事实上,新一代的开发人员会采用他们认为更容易使用的其他语言或框架,即使是最流行的语言也不可避免地会走向衰落。...2、Haskell 据了解,Haskell 将在 2020 年进行一次重大的标准更新(具体可查看(由 GHC 和 GitHub 中与 Haskell 相关的仓库),许多著名的公司和项目(Facebook...、GitHub等)都曾使用过 Haskell 来构建重要的程序 然而,Haskell 长期在 RedMonk 的排名中表现平平,这表明没有开发者关注它,不知道是否可以理解为它“快死了”,或者已经“死了”...3、Objective-C 苹果的 Objective-C 已经 35 年的历史了,不过很明显,如今苹果公司已经不管它的死活了,五年前,苹果为其生态系统推出全新且经过改进的编程语言 Swift,并且迅速登上编程语言的舞台

85330

5 门可能衰落的编程语言

事实上,新一代的开发人员会采用他们认为更容易使用的其他语言或框架,即使是最流行的语言也不可避免地会走向衰落。...2、Haskell ?...据了解,Haskell 将在 2020 年进行一次重大的标准更新(具体可查看(由 GHC 和 GitHub 中与 Haskell 相关的仓库),许多著名的公司和项目(Facebook、GitHub等)都曾使用过...Haskell 来构建重要的程序 然而,Haskell 长期在 RedMonk 的排名中表现平平,这表明没有开发者关注它,不知道是否可以理解为它“快死了”,或者已经“死了” 3、Objective-C...苹果的 Objective-C 已经 35 年的历史了,不过很明显,如今苹果公司已经不管它的死活了,五年前,苹果为其生态系统推出全新且经过改进的编程语言 Swift,并且迅速登上编程语言的舞台,毋庸置疑

59420

5门可能衰落的编程语言

为了确定哪种编程语言可能在中长期内注定失败,我们查看了 TIOBE 和 RedMonk 的受欢迎程度排名,以及 Dice 的职业生涯帖子数据库,总结出以下编程语言的未来不是太光明,如果你的职业生涯基于以下任何一种语言...02 Haskell 据称,Haskell 将在 2020 年进行一次重大的更新(由 GHC 和 GitHub 中与 Haskell 相关的仓库可以看出)。...然而,Haskell 在 RedMonk 的语言排名长期保持不变且比较靠后,这表明几乎没有开发者关注它。是否意味着它死了还是完全死了?...它是一种更通用的语言,更广泛的应用程序。...不过正如一些帮助的评论者指出的那样,事实并非如此:它每年更新一次。然而,鉴于它在 RedMonk 和 TIOBE 上的排名下降,我们仍然认为这是一门衰落迹象的语言。 ? 有话要说?

83630

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

两个基本的想法,一是想办法让所有数据类型在我们的数据结构中有同样的行为方式,二是对我们的数据结构进行多份拷贝,并稍作调整,以特定的方式处理每种数据类型。...通常是通过在堆上分配内存,在数据结构中放指针来实现的。我们可以让不同类型的指针同样的行为方式,这样,同样的代码就可以处理所有的数据类型了。...这种方式虽然被Haskell类型类使用,但GHCGHCHaskell编译器)通过内联和特殊化,也可以做单态化优化。...D语言一个有趣的解决方法,也与动态语言中流行的做法类似:只需使用帮助函数来检查类型是否有效,如果失败的话,错误信息会指向帮助函数! 下面是D语言中的例子。...这一方式也让Swift的编译器和HaskellGHC等编译器即使默认使用装箱来实现泛型,也可以单态化作为优化手段。 机器码单态化 单态化泛型的下一步是在编译器后端中进一步推进。

3K30

模块_Haskell笔记2

Data.Map import qualified Data.Map as M hiding语法能够缓解命名冲突问题,但不很方便,对于存在大量命名冲突的模块,可以通过qualified保留命名空间来避免冲突...GHCi环境 通过:m命令引用模块: > :m Data.List > :m Data.List Data.Map Data.Set GHC 7.0之后,支持在GHCi环境直接使用import语法:...,子模块还可以子模块…… 对目录结构及命名要求,例如: . ├── main.hs └── Math ├── Number.hs └── Vector.hs 包名要求首字母大写(Math...- 子串匹配,是否以为指定子串结尾 isSuffixOf :: Eq a => [a] -> [a] -> Bool -- 元素包含性检测,是否包含指定元素 elem :: (Foldable t, Eq...Set.fromList 集合去重效率高于List.nub,但缺点是构造集合会对元素进行排序,所以得到的去重结果不保留原顺序(List.nub会保留) 参考资料 Haskell/Modules Haskell

1.7K30

从 Java 和 JavaScript 来学习 Haskell 和 Groovy(元编程)

正式介入元编程的部分,先来看看 Java,它的方式比较原始,也比较清晰,本身它定义了 Class、Method、Field 等等描述一个类的基本概念,基于静态语言的限制,没有办法真正在运行时改变一个类内部的结构...(但是可以在运行时获取一个类内部的结构),于是了像 CGLib 这样在运行时使用动态代理,创建一个类来替代的办法,让使用者看起来好像是改变了原始类的结构。...Haskell 的元编程并非核心内容,因此也更加初级,据我所知,基本上谈及 Haskell 的元编程,必谈 Template Haskell(TH)。...比如 [d|head’ (x:_) = x|] 这样的表达式会被解析成为这样一棵 AST:[FunD head’ [Clause [InfixP (VarP x_1) GHC.Types.: WildP...Java 的所有元编程能力全部保留,在之基础上,下面我选择地介绍几条。

48920

Operating System 05 - 进程通信

随着程序规模和进程数量的增长, 潜在的死锁问题很难避免. 这种通信范式最好出现在底层编程场合, 例如操作系统内核中....软件事务性内存(STM, Software Transactional Memory) 我们在HaskellGHC的实现和基于JVM的Clojure语言中看到这种机制....事物本身显著开销, 对于数量较多的并发访问性能差. 在确定进程成功前, 需要额外的内存来存放试图写入的数据....消息队列 相比较FIFO, 消息队列有以下优点: 消息队列可以独立于读写进程存在, 从而避免了FIFO中同步管道的打开和关闭时可能产生的困难. 避免了FIFO的同步阻塞, 不需要进程提供同步方法....读进程可以根据消息类型选择的接收消息, 而不像FIFO那样只能默认的接收. 信号量 他是一个计数器, 用于为多个进程提供共享数据对象的访问.

31810

GitHub趋势榜第一:超级命令行工具Semantic,比较解析源代码

作为开发者,你是否对不同源代码段之间的解析和比较困惑不已呢?今天的GitHub趋势热榜上排名第一的帖子介绍了一款多语言支持的“超级命令行工具”Semantic,或许可以解决这个令人头疼的问题。...Semantic是一个Haskell库,也是一个用于分析和比较源代码的命令行工具。 本文将从应用功能、语言支持、开发、技术和架构、许可等五个方面介绍Semantic这款工具。...force cabal new-update cabal new-build cabal new-test cabal new-run semantic -- --help Semantic最低要求GHC...我们建议使用ghcup沙箱GHC版本。我们使用的版本基于StackageLTS版。目前的LTS版本是13.13。如果您愿意,也可以使用堆栈版。...执行分析,计算差异,或仅返回解析树。 以多种支持格式呈现输出。

83430
领券