Haskell 趣学指南 入门笔记(二)

显示类型声明,Haskell是不用定义类型的原因,很像python

想要确定某个表达式的类型

1 *Main> :t ‘a‘
2 ‘a‘ :: Char
3 *Main> :t True
4 True :: Bool
5 *Main> :t "HELLo"
6 "HELLo" :: [Char]

可以用:t 显示

所以当我们定义一个函数时,可以加上类型声明。

body.hs函数

addthree::Int -> Int ->Int -> Int
addthree x y z =x+y+z
fac::Integer -> Integer
fac n= product [1..n]
*Main> fac 100
93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

Integer自带 高精度,内存大多,就能表示多大的数。。

类型类

Eq类

*Main> ‘a‘==‘a‘
True
*Main> 5/=6
True
*Main> 

Ord类 比较大小类。还有其他一些类

函数语法---模式匹配

类似c++Switch case

sayMe::Int-> String
sayMe 1="One!"
sayMe 2="Two!"
sayMe 3="Three!"
sayMe 4="Four!"
sayMe 5="Five!"
sayMe x="Not between 1 and 5!"

调用

*Main> :l body
[1 of 1] Compiling Main             ( body.hs, interpreted )
Ok, modules loaded: Main.
*Main> sayMe 5
"Five!"

自己写head函数

1 head‘ :: [a]->a
2 head‘ []=error "Can call head on an empty list,dummy!"
3 head‘ (x:_)=x

As模式没看懂怎么回事,大概是自己调用自己??、

1 firstletter :: String->String
2 firstletter ""="Empty string,whoops!"
3 firstletter [email protected](x:xs)="The first letter of" ++ all ++ " is " ++[x]
4
5
6 *Main> firstletter "Dracula"
7 "The first letter ofDracula is D"
8 *Main> 

哨卫,又好像case语句

 1 bkm:: Double->String
 2 bkm bmi
 3   | bmi<=18.5="1!"
 4   | bmi<=25.0="2!"
 5   | bmi<=30.0="3!"
 6   | otherwise=">3"
 7
 8
 9 *Main> bkm 19.9
10 "2!"

where 关键字
 避免重复计算一个值

 1 bkm:: Double->Double->String
 2 bkm weight height
 3   | bmi<=skinny="1!"
 4   | bmi<=normal="2!"
 5   | bmi<=fat="3!"
 6   | otherwise=">3!"
 7   where bmi=weight/height^2
 8         skinny=18.5
 9         normal=25.0
10         fat=30.0

模块内的代码注意对其,类似python

let语句:绑定语句在前,后面跟表达式

1 *Main> (let a=100;b=200;c=300 in a*b*c,let foo="Hey";bar="there!" in foo++bar)
2 (6000000,"Heythere!")

居然也有Case 表达式。。

好玩点的递归啊!

原来这里快速排序可以这样写,好简洁

 1 quicksort [] =[]
 2 quicksort (x:xs)=
 3    let small=[a|a<-xs,a<=x]
 4        lager=[a|a<-xs,a>x]
 5    in quicksort small++ [x]
 6
 7 Prelude> :l body
 8 [1 of 1] Compiling Main             ( body.hs, interpreted )
 9 Ok, modules loaded: Main.
10 *Main> quicksort [1,2,3,4,5,6,9,7,8]
11 [1,2,3,4,5,6,7,8,9]

虽然这个快排是这原始的那种吧,本身可能会有点问题,因为每次都是选择列表第一个元素,但是的确简洁啊

这篇博客主要计入自己开始入门Haskell的点滴。

写得不好,多多包涵!

时间: 2024-10-17 20:20:51

Haskell 趣学指南 入门笔记(二)的相关文章

Haskell 趣学指南 入门笔记(一)

废话少说.正题 什么是函数式语言,我的初步理解是:以函数为主导,函数构成函数. 现在编译器,后缀为.hs 跳过下载安装那部分. 我是windows 系统下 我自己又找了一个带图形界面的编辑器:winGhci http://www.softpedia.com/get/System/Launchers-Shutdown-Tools/WinGhci.shtml 挺简洁的 有点类似python自带的那个 Haskell 函数为主体: succ 是指下一个. 最奇怪的事 min ,max函数居然 可以不要

《Haskell趣学指南 Learn You a Haskell for Great Good!》-代码实验

doubleMe x = x + x doubleUs x y = doubleMe x + doubleMe y doubleSmallNumber x = if x>100 then x else x * 2 doubleSmallNumber' x = (if x>100 then x else x * 2) + 1 boomBangs xs = [if x < 10 then "BOOM!" else "BANG!" | x <- x

Hadoop权威指南学习笔记二

MapReduce简单介绍 声明:本文是本人基于Hadoop权威指南学习的一些个人理解和笔记,仅供学习參考,有什么不到之处还望指出,一起学习一起进步. 转载请注明:http://blog.csdn.net/my_acm 上一篇介绍了什么是Hadoop.Hadoop的作用等.本篇相同基于Hadoop权威指南,结合迪伦的Hadoop的视频教程对MapReduce做一个介绍. 1. MapReduce是Hadoop的核心之中的一个.MapReduce分为两个部分,Mapper和Ruducer模块.简单

nodeJs入门笔记(二)

js中window通常是全局变量 global 是node.js里的全局变量 node中能访问的对象一般都是 global的 属性 global 对象属性 process 用于描述当前Node 进程状态的对象,提供了一个与操作系统的简单接口. process.argv :命令行参数数组,第一个元素是 node,第二个元素是脚本文件名,从第三个元素开始每个元素是一个运行参数 console.log(process.argv); $ node argv.js 1991 name=byvoid --v

kettle入门笔记(二) 之 kettle报的坑爹错误:Error occured while trying to connect to the database

1 引言 在用kettle开发时常会出现 Error occured while trying to connect to the database 错误,但是仔细观察日志,引起这个错误的原因不尽相同.这个错误看起来很简单,但是有时候越简单的错误越没有耐心改,尤其是忙的时候,不小心填错了某个参数导致这个错误但是自己感觉没问题却跑不成功,这是最烦人的.这时候需要淡定.不妨上网查查,错误也许就可以愉快的解决了.下面给出这错误的更细节错误的不同发生情况. 2 示例 有个很简单的ktr脚本(当前kett

21天学通Python笔记(二)

五. >>> def hello(): print('123123') >>> hello() 123123 >>> def hello1(v): print(v) return v >>> a = hello1(123) 123 >>> a 123 >>> def hello2(v1, v2): print(v1) return v2 >>> b = hello2(1, 3) 1

SQL查询初学者指南读书笔记(二)创建SQL查询

PARTII: SQL Basics CHAPTER 4Creating a Simple Query 介绍一种如何创建SQL语句的技术--"Request/Translation/Clean Up/SQL" The SELECT operationin SQL can be broken down into three smaller operations, which we will referto as the SELECT statement,the SELECT expres

Shader 入门笔记(二) CPU和GPU之间的通信

渲染流水线的起点是CPU,即应用阶段. 1)把数据加载到显存中 2)设置渲染状态,通俗说这些状态定义了场景中的网格是怎样被渲染的. 3)调用DrawCall,一个命令,CPU通知GPU.(这个命令仅仅会指向一个需要被渲染的图元列表,并不会包含材质信息,因为在上一阶段已经完成) CPU流水线 GPU从CPU那里得到渲染命令后,就会进行一系列流水线操作,最终把图元渲染到屏幕上. 几何阶段: 顶点着色器/曲面细分着色器/几何着色器 裁剪(Clipping):将不在视野范围内的顶点裁减掉,这阶段可配置的

SpringBoot入门笔记(二)、使用fastjson

1.添加fastjson配置 <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.15</version> </dependency> 2.重写configureMessageConverters @Override public void configureMessageConve