博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Real World Haskell学习篇-第1章: 入门
阅读量:4970 次
发布时间:2019-06-12

本文共 5328 字,大约阅读时间需要 17 分钟。

1. 初识解释器ghci

  1.1  查看帮助: :?

  1.2  修改提示符: :set prompt ghci>>>

  1.3  加自己指定模块: :module + Data.Ratio

2. 基本交互

  2.1 基本算术运算

    中缀表达式:

1 ghci>>> 3 ^ 32 273 ghci>>> 2 + 44 65 ghci>>> 5 / 36 1.6666666666666667

    前缀表达式:

1 ghci>>> (^) 3 32 273 ghci>>> (/) 5 24 2.55 ghci>>> (+) 1 9

  2.2 算术中的负数

1 ghci>>> -82 -83 ghci>>> 1 + -44 5 
:57:1:6 Precedence parsing error7 cannot mix ‘+’ [infixl 6] and prefix `-' [infixl 6] in the same infix expression8 ghci>>> 1 + (-3)9 -2

-8其实并不是直接表示负数8, 而是利用一元操作符'-'对8取负, 所以第3行不能与中缀表达式一起使用, 除非加上()。

1 ghci>>> 55*-22 3 
:60:3:4 Not in scope: ‘*-’5 Perhaps you meant one of these:6 ‘*>’ (imported from Prelude), ‘**’ (imported from Prelude),7 ‘*’ (imported from Prelude)

这样是另一种不认识的操作符。

  2.3 布尔运算(True False)和比较运算

3种运算符: && || not    Haskell中True不是1, False不是0.

1 ghci>>> True && False 2 False 3 ghci>>> True || False 4 True 5 ghci>>> not False 6 True 7 ghci>>> True && 1 8  9 
:75:9:10 No instance for (Num Bool) arising from the literal ‘1’11 In the second argument of ‘(&&)’, namely ‘1’12 In the expression: True && 113 In an equation for ‘it’: it = True && 114 ghci>>> 1 == 115 True16 ghci>>> 4 > 617 False18 ghci>>> 33 <= 5019 True

  2.4 运算符优先级和结合性

可以有命令 :info 查看指定操作符的优先级值, 1表示最低, 9 表示最高。

1 ghci>>> 2 + 3 * 5 ^ 2 2 77 3 ghci>>> :info (+) 4 class Num a where 5   (+) :: a -> a -> a 6   ... 7       -- Defined in ‘GHC.Num’ 8 infixl 6 + 9 ghci>>> :info (*)10 class Num a where11   ...12   (*) :: a -> a -> a13   ...14       -- Defined in ‘GHC.Num’15 infixl 7 *16 ghci>>> :info (^)17 (^) :: (Num a, Integral b) => a -> b -> a     -- Defined in ‘GHC.Real’18 infixr 8 ^
View Code

  2.5 变量的定义

使用ghci的let定义临时变量

1 ghci>>> pi2 3.1415926535897933 ghci>>> e4 5 
:84:1: Not in scope: ‘e’6 ghci>>> let e = exp 17 ghci>>> e8 2.718281828459045
View Code

exp 1 表示调用指数函数exp,参数为1, 不必使用()。

3. 列表(List)

  列表长度可以是任意的。

  空的列表就是[]。

  列表中的元素必须相同类型。

1 ghci>>> [1,2,3,4] 2 [1,2,3,4] 3 ghci>>> [] 4 [] 5 ghci>>> ['foo','rt'] 6  7 
:89:2: 8 Syntax error on 'foo' 9 Perhaps you intended to use TemplateHaskell10 In the Template Haskell quotation 'foo'11 ghci>>> ["foo","rt"]12 ["foo","rt"]13 ghci>>> [True,False,1,"str"]14 15
:91:15:16 Couldn't match expected type ‘Bool’ with actual type ‘[Char]’17 In the expression: "str"18 In the expression: [True, False, 1, "str"]19 In an equation for ‘it’: it = [True, False, 1, ....]
View Code

  可以用列举符号 .. 表示一系列的列表元素, 也可以根据前面的元素步长,自动填充后面省略的元素, 但是float类型可能会涉及到四舍五入的情况:

1 ghci>>> [1..10] 2 [1,2,3,4,5,6,7,8,9,10] 3 ghci>>> [1,4,7..20] 4  5 
:93:7: parse error on input ‘..’ 6 ghci>>> [1,4,7,..20] 7 8
:94:8: parse error on input ‘..’ 9 ghci>>> [1,4..20]10 [1,4,7,10,13,16,19]11 ghci>>> [1,8..20]12 [1,8,15]13 ghci>>> [1.2..2.3]14 [1.2,2.2]15 ghci>>> [1.2..2.6]16 [1.2,2.2]17 ghci>>> [1.2..3.6]18 [1.2,2.2,3.2]19 ghci>>> [1.0..1.8]20 [1.0,2.0]
View Code

  当然你可以用[1..], 省略终点的方式产生一个无穷数列。

3.1 列表操作符 (连接)

  使用 ++ 连接N个相同元素的列表。

  使用 : 在某列表头部加入。(格式必须: 前面是单个元素,后面是一个列表)

1 ghci>>> [] ++ [False,True] ++ [False] 2 [False,True,False] 3 ghci>>> 100:[2,3,4,5] ++ [6,8,4] 4 [100,2,3,4,5,6,8,4] 5 ghci>>> [2,3]:1 6  7 
:105:1: 8 Non type-variable argument in the constraint: Num [[t]] 9 (Use FlexibleContexts to permit this)10 When checking that ‘it’ has the inferred type11 it :: forall t. (Num t, Num [[t]]) => [[t]]
View Code

4. 字符串和字符

  字符串就是很多个单字符组成的列表, 所以可以列表的连接操作。

  putStrLn 是输出字符串的函数。 \n \r 与C语言一样转意。

  ""与[]是相同的。

1 ghci>>> "Hello Haskell" 2 "Hello Haskell" 3 ghci>>> putStrLn "We are in ghci console.\n See here." 4 We are in ghci console. 5  See here. 6 ghci>>> 'c' 7 'c' 8 ghci>>> let a = ['h','e','l','l','o'] 9 ghci>>> a10 "hello"11 ghci>>> a == "hello"12 True13 ghci>>> [] == ""14 True15 ghci>>> 'w':"Haskell"16 "wHaskell"17 ghci>>> "Frist" ++ "Second"18 "FristSecond"
View Code

5. 类型表示

  Haskell中,所有的类型以大写字母开始,变量以小写字母开始。

  可以使用 :set +t 是ghci返回结果的类型, :unset +t。

  可以使用 :type var/expression 显示变量或表达式的类型, 并不参与计算。

1 ghci>>> :set +t 2 ghci>>> 'c' 3 'c' 4 it :: Char 5 ghci>>> "foo" 6 "foo" 7 it :: [Char] 8 ghci>>> 7^80 9 4053621559714438683206586610901667380087522225101208374619245444800110 it :: Num a => a11 ghci>>> :m +Data.Ratio12 ghci>>> 11 % 3313 1 % 314 it :: Integral a => Ratio a15 ghci>>> 11 % 3.316 17 
:121:1:18 No instance for (Fractional a0) arising from a use of ‘it’19 The type variable ‘a0’ is ambiguous20 Note: there are several potential instances:21 instance Integral a => Fractional (Ratio a)22 -- Defined in ‘GHC.Real’23 instance Fractional Double -- Defined in ‘GHC.Float’24 instance Fractional Float -- Defined in ‘GHC.Float’25 In the first argument of ‘print’, namely ‘it’26 In a stmt of an interactive GHCi command: print it27 ghci>>> :unset +t28 ghci>>> type 'c'29 30
:123:6: parse error on input ‘'’31 ghci>>> :type 'c'32 'c' :: Char33 ghci>>> :type 1+834 1+8 :: Num a => a
View Code

6. 行计数程序 (WC.hs)

 1 main = interact wordCount 2 where wordCount input = show (length (lines input)) ++ "\n" 

然后新建一个quux.txt文件进行测试(内容随便写写)。

打开shell命令行切换到当前目录, 执行: runghc WC < quux.txt

即可得到txt文件的行数。

 

转载于:https://www.cnblogs.com/burnet/p/5462723.html

你可能感兴趣的文章
mysql 安装补充
查看>>
大学里如何学习 ?
查看>>
Oracle命令类别
查看>>
js面试题:关于数组去重的四种方法总结
查看>>
Linux内核分析(三)----初识linux内存管理子系统
查看>>
stc12c5a60s2驱动TEA5767收音机模块硬件调试总结
查看>>
vue中提示$index is not defined
查看>>
Java中对List集合内的元素进行顺序、倒序、随机排序的示例代码
查看>>
css选择器
查看>>
看懂下面C++代码才说你理解了C++多态虚函数!
查看>>
ASP.NET上传下载文件
查看>>
Galaxy Nexus 全屏显示-隐藏Navigation Bar
查看>>
Mob-第三方分享 /手机验证码
查看>>
Spring中使用Velocity模板
查看>>
实现model中的文件上传FTP(一)
查看>>
MonkeyRecorder
查看>>
Maven概述
查看>>
上周热点回顾(8.18-8.24)
查看>>
Feature toggle
查看>>
day02
查看>>