Haskell的基本语法和GHCi

1.注释

a) --这是一行注释

b) {-

这是一段注释

-}

2.表达式

a) 3 :: Float 标示是一个浮点数3,::起到说明类型的作用

b) sort [3,8,1,4] 是一次函数调用。Haskell中的函数调用不需要加括号,多个参数中间也不用加逗号。

c) Case Foo of True -> 1

False ->2

最后一个表达式的值在Foo是True时等于1,否则等于2。

值得注意的是:if...then...else和case...of...这些语句虽然在其他语言中作为控制结构的声明,在Haskell中大部分都是表达式。

d) 表达式就是有值的式子,Haskell和大多数编程语言一样,程序中包含表达式和声明两种;

3.声明

a) Haskell是一门强类型语言,所有表达式都有确定的类型,::可以用来手动标注类型

b) 绑定

addOne :: Int -> Int

addOne x = x +1

Welcome :: String

Welcone = “hello world”

上面语句中:welcome :: String 读作welcome的类型是String,=则是把右侧的表达式绑定在左侧的名称上了,在代码其余地方,每当想要用”hello world”时使用wecome即可。

NOTE:在Haskell语言中一旦一个名字被绑定给了表达式(上述”hello world”也是表达式),这个名称包含的表达式就永远不会再变了,Haskell中不存在变量的概念,只存在绑定,任何时刻一个名称对应的表达式都是唯一确定的。

上述addOne 是一个函数绑定,与第二个不同,判断方法是=后有多个名称。

c) 作用域

X = 1

Let x = 2

In y = x --此处y == 2

Z = x --此处z ==1

d) 导入

Haskell会默认在所在模块导入一个叫Prelude的模块函数,包含了许多基本的函数(例如print)。Haskell中的许多重要模块(包括prelude)一起构成了base库,这套base库会随着Haskell编译器一起发行。所以只有有可以工作的GHC,就可以直接导入base中的所有模块

e) 牢记:

Haskell中没有变量和赋值,只有绑定,且一旦绑定不能改变

Haskell中没有条件、循环、分支等控制声明,条件和分支在Haskell中是表达式的一部分

4.函数

a) 函数分为普通函数和中缀函数两种。普通函数的调用方法就是函数跟上参数,中缀函数和算式中的加减乘除差不多:先写一个参数,再写函数,最后再跟上一个参数

想要把一个普通函数当成中缀函数使用,需要在函数两边加上``(注意是键盘左上角``,不是‘’)

想要把中缀函数当成普通函数使用,需要在中缀函数两边加上括号

Eg.

elem 3 [1,2,3]

--elem x xs 判断列表xs中是否出现了x

3 `elem` [1,2,3]

--普通函数以中缀函数的形式调用

Eg.

(+) 1.5 1.5

--等价于1.5 + 1.5

b) ::是类型说明函数,优先级最低

5.GHCi

a) GHCi身处在一个连续的运算过程中,后面的绑定可以覆盖前面的绑定,暂时记得在GHCi中绑定名称时,一定要在前面加上let就好:let xs = [2,3,4,5]

b) 在Haskell中,确定的类型首字母大写(例如Float和Bool)代表常亮,而不确定的类型一般都随意用小写字母a,b,c。。。表示,代表类型变量。当然也可以用小写字母开头的单词表示类型变量。

c) 查询中缀函数&& 的信息:

:info && 或 :t (&&)

d) 绑定中缀函数的方法:(以++++做平方和为例)

(++++) :: Int -> Int -> Int

x ++++ y = x^2 + y^2

或者

(++++) :: Int -> Int -> Int

(++++) x y = x^2 + y^2

但是在GHCi中必须加上let才能使

e) 一些初级函数:

!! :: [a] -> Int -> a

--取列表第n个元素(从0开始)

[1,3,4] !! 2

--3

head :: [a] -> a

tail :: [a] -> [a]

--取列表头和尾

init :: [a] -> [a]

last :: [a] ->a

--取列表始和末

null :: [a] -> Bool

--判断列表是否为空

length :: [a] -> length

求列表长度

Take 2 [1,2,3,4,5]

--[1,2]

--取列表前N个元素

reverse :: [a] -> [a]

--颠倒一个列表

elem ,notElem 判断元素是否在列表中

min,max --判断两个元素中最大/最小的那个

minmum,maxmum --判断列表中最大/最小的那个

时间: 2024-11-04 01:00:54

Haskell的基本语法和GHCi的相关文章

iOS开发-OC语言 (六)点语法和@property

点语法和@property 知识点 1.setter/getter函数 2.点语法 [email protected]语法和属性 ======================================== 一.setter和getter函数 1.setter和getter函数的作用 setter  方法:   修改对象的字段/实例变量 getter 方法:   读取对象的字段/实例变量 setter 方法: 可以带有多个参数,可以同时给多个变量赋值 getter方法: 不带参数,只能返回一

OC第四节 ——点语法和@property

一.setter和getter函数     1.回忆:如何访问对象中的成员变量    2.setter和getter函数的作用            setter  方法:   修改对象的字段/实例变量            getter 方法:   读取对象的字段/实例变量                        setter 方法: 可以带有多个参数,可以同时给多个变量赋值 getter方法: 不带参数,只能返回一个变量的值. 3.setter和getter如何命名          

运维工具Ansible浅谈playbook讲解以及YAML语法和JSON语法的互化

引言:运维发展到今天已经远远不是传统的运维做一些重复性的枯燥工作,面对海量爆发的访问量,传统的运维已经很吃力,比如让你装三五台机器的系统,这个so easy,那要是安装几百上千台呢,还easy吗.我要安装nginx服务,并提供好相应的端口转发机制以及location资源访问机制,但是有多发十几台这样的机制,并且每台机器转发机制都不相同,这个对我们来说是一个不小的挑战,因此运维进入了自动化时代,自动化运维就显得重要了.因此本文就是围绕自动化运维工具Ansible来展开的. 一,为什么要使用Ansi

Webstorm 添加新建.vue文件功能并支持高亮vue语法和es6语法

添加新建.vue文件功能 ①Webstorm 右上角File-Plugins 搜索vue如果没有就去下载 点击serch in repositories ②点击安装vue.js ③安装成功后点击右下角Apply 提示重启webstorm 重启完成后 Setting-Editor-File and Code Templates 点击右上角的加号 添加vue文件 Name为vue File, Extension 为vue,下面的位置可以填写自定义的初始化模板内容 ④点击OK 返回,在项目中新建会出现

Markdown 语法和 MWeb 写作使用说明(个人留存)

本人使用的是 MWeb Lite 工具,Mac 版 . # Markdown 语法和 MWeb 写作使用说明 ## Markdown 的设计哲学 > Markdown 的目標是實現「易讀易寫」. > 不過最需要強調的便是它的可讀性.一份使用 Markdown 格式撰寫的文件應該可以直接以純文字發佈,並且看起來不會像是由許多標籤或是格式指令所構成. > Markdown 的語法有個主要的目的:用來作為一種網路內容的*寫作*用語言. <!-- more --> ## 本文约定 如

Django模板语法和vue语法有冲突

1.解决方案1在django1.5以后的版本,给出了解决方法,即使用标签{% verbatim myblock %} {% endverbatim myblock %}例如: {% verbatim myblock %} <span>Message: {{ msg }}</span> {% endverbatim myblock %} 被此标签包裹的内容,django的模板引擎不会对其进行渲染,从而解决语法冲突的问题. 2.解决方案2修改Vue的{{ }} 为{[ ]},即通过js

swift语法和java的比较

1. 定义常量和变量 a. Swift语法 常量: let MaxNumber = 10 变量: var name = 1 b. Java语法 常量: public final int MaxNumber= 10; 变量: public String name = "morden"; 这里要注意的是swift有类型标注(type annotation)这个语法:如果要添加类型标注,需要在常量或者变量名后面加上一个冒号和空格,然后加上类型名称.但是因为swift编译器可以进行类型安全判定

Razor语法和Razor引擎大全

一.Razor语法 1.Razor的标识符 解释:@字符被定义为Razor服务器代码块的标识符,后面的表示是服务器代码了.web form中使用<%%>中写服务器代码一个道理.在vs工具里面提供了代码着色和智能感应的功能. @{ string userName = "启超"; <span>我的名字叫:@userName</span> <span>我的出生日期:@DateTime.Now.ToString("yyyy-MM-dd&

黑马程序员- oc中点语法和@property的使用

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 点语法 其实就是set方法和get方法 #import<Foundation/Foundation.h> @interface Person : NSObject { int _age; } - (void)setAge:(int)age; - (int)age; @end @implementation Person - (void)setAge:(int)age { _age = age