[yotroy.cool]Haskell笔记二

个人博客https://www.yotroy.cool/,欢迎关注我哦~

============================================================

类型

特性

强(strong)类型

静态(static)

可以通过自动推导(automatically inferred)得出

基本类型

Char
Bool
Int 常用 定长(fixed-width)整数 一般32/64位宽
Integer 不常用 不定长
Double 常用 浮点数
Float 不常用 计算慢
Prelude> :type 'a'
'a' :: CharPrelude> 'a'            -- 自动推导
'a'::符号
Prelude> 'a' :: Char    -- 显式签名
'a'

调用函数

Prelude> odd 3
TruePrelude> compare 2 3
LT
e.g. LT EQ GTPrelude> (compare 2 3) == LT
TruePrelude> compare (sqrt 3) (sqrt 6)  -- 此处括号不可去
LT

复合数据类型:列表和元组

不同?

列表可以任意长,且只能包含类型相同的值。

元组的长度是固定的,但可以包含不同类型的值。

可递归性

[[Int]]是一个包含 [Int] 类型值的列表,而 [Int]又是一个包含 Int 类型值的列表即用 Int 类型替换了类型变量 a 。

列表[]及 head, tail, last ; take, drop

head 取第一个元素, tail 取除第一个外所有
last 取最后一个元素

Prelude> head [1, 2, 3, 4]
1Prelude> head []
*** Exception: Prelude.head: empty listPrelude> tail "list"
"ist"
ghci> last [1,2,3]
3
Prelude> take 2 [1, 2, 3, 4, 5]
[1,2]
Prelude> drop 2 [1, 2, 3, 4, 5]
[3,4,5]
Prelude> drop 4 [1, 2]
[]
Prelude> drop (-1) "foo"    --第一个参数小于或等于 0时, drop 函数返回整个输入列表
"foo"

元组 () 及 fst, snd

大小至少为2

元组的类型由它所包含元素的数量、位置和类型决定

Prelude> :type (True, "hello")
(True, "hello") :: (Bool, [Char])
Prelude> (4, ['a', 'm'], (16, True))
(4,"am",(16,True))
Prelude> :t ()
() :: ()
Prelude> fst (1, 'a')
1Prelude> snd (1, 'a')
'a'

元组使用场景e.g.

  • 如果一个函数需要返回多个值,那么可以将这些值都包装到一个元组中,然后返回元组作为函数的值。

  • 当需要使用定长容器,但又没有必要使用自定义类型的时候,就可以使用元组来对值进行包装。

利用括号将表达式传给函数

a b c d 等于 (((a b) c) d)

纯度

带副作用的函数称为 不纯(impure)函数 ,而将不带副作用的函数称为 纯(pure)函数

副作用即函数中全局变量可修改如取决于某一时刻的值,本质上是函数的一种不可见的(invisible)输入或输出。Haskell 的函数在默认情况下都是无副作用的:函数的结果只取决于显式传入的参数。

不纯函数的类型签名都以 IO 开头,以下为检测e.g.:

Prelude> :type readFile
readFile :: FilePath -> IO String
-- 不纯函数的类型签名都以 IO 开头

加载.hs文件

ghci中通过:load

变量

一旦变量绑定了(也即是,关联起)某个表达式,那么这个变量的值就不会改变。如.hs文件中就不行,但ghci命令行里可以。

e.g. [Assign.hs]

条件求值

不同分支之间的类型必须相同。
e.g.:

[myDrop.hs]

-- file: ch02/myDrop.hsmyDrop :: Int -> [a] -> [a]
myDrop n xs = if n <= 0 || null xs    -- ## null用法then xs   -- 缩进不可省略else myDrop (n - 1) (tail xs) -- 缩进不可省略-- 代换(substitution)和重写(rewriting)
-- 代换了变量n和xs
-- 重写了myDrop函数-- ## 惰性求值
-- 也可写成一行 e.g.[myDropX.hs](ch02/myDrop.hs)-- ## 条件求值
-- null xs not equals to xs == null
-- then 和 else 之后的表达式称为“分支”,
-- 不同分支之间的类型必须相同。
-- 而if不是分支。-- e.g.
-- Prelude> if True then 1 else "foo"-- <interactive>:2:14:
--     No instance for (Num [Char])
--         arising from the literal `1'
--     Possible fix: add an instance declaration for (Num [Char])
--     In the expression: 1
--     In the expression: if True then 1 else "foo"
--     In an equation for `it': it = if True then 1 else "foo"

->
可精简到一行 [myDropX.hs]

-- file: ch02/myDropX.hs
myDropX n xs = if n <= 0 || null xs then xs else myDropX (n - 1) (tail xs)

惰性求值

e.g. [isOdd.hs]

-- file: ch02/isOdd.hs
isOdd n = mod n 2 == 1-- ghci> isOdd (1+2)
-- True--in general:XXXXXX
-- first: (1+2)
-- second: mod 3 2
-- third: 1 == 1
-- True--but in haskell:
--(1+2) 最后算!当真正有需要的时候再计算出 isOdd (1 + 2) 的值
--追踪未求值表达式的记录被称为块(chunk)

递归

注意惰性求值,递归 -> 终止递归 -> 递归返回
解释
e.g. [myDrop.hs]

个人博客https://www.yotroy.cool/,欢迎关注我哦~

============================================================

多态

参数多态

Prelude> :type last
last :: [a] -> a
ghci> last [1,2,3]
3

如果将一个类型为 [Char] 的列表传给 last ,那么编译器就会用 Char 代换 last 函数类型签名中的所有 a ,从而得出一个类型为 [Char] -> Char 的 last 函数。诸如此类可以是Int,可以是任何类型。这种类型的多态被称为参数多态。

参数多态没有办法知道输入参数的实际类型

缺少

Haskell没有子类多态和强制多态(coercion polymorphism)。

多参数函数的类型

e.g.

Prelude> :type take
take :: Int -> [a] -> [a]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/815363.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零实现诗词GPT大模型:专栏内容规划

一、前情介绍 本系列文章将从头编写一个类GPT的深度学习模型&#xff0c;并在诗词数据集上进行训练&#xff0c;从而可以进行诗词创作。 本次实现的类GPT模型&#xff0c;可以在kaggle上使用免费GPU进行训练&#xff0c;并可以在自己的电脑上进行推理&#xff0c;整个学习过程…

洛谷刷题 深度优先搜索-[P1025]数的划分(C++)

题目描述 将整数 n 分成 k 份&#xff0c;且每份不能为空&#xff0c;任意两个方案不相同&#xff08;不考虑顺序&#xff09;。 例如&#xff1a;n7&#xff0c;k3&#xff0c;下面三种分法被认为是相同的。 1,1,5 1,5,1 5,1,1 问有多少种不同的分法。 输入格式 n,k &am…

三种定时任务:

三种定时任务&#xff1a; 1:Timer定时器 Timer定时器是Java内置的定时任务工具类&#xff0c;可以在指定的时间间隔内执行任务。 Timer中的任务是在Timer的任务线程中按照一定的时间间隔执行的&#xff0c;而TimerTask则是实际定时执行的任务。Timer和TimerTask都是线程安全…

《Java面试自救指南》(专题六)Java框架(含spring、Mybatis、Netty)

文章目录 力推的Java框架课程Spring的启动流程(IOC容器创建第一步)Spring IOC如何实现 (DefaultListAbleBeanFactory)Spring后置处理器怎么实现的?Spring AoP如何实现,有什么作用Spring监听器怎么实现的Spring事务传播机制有哪几种Spring Bean的注入方式Bean的生命周期和作…

mit MIT 6.S081 Operating System labs随记

lab 1 中 primes.c 写了一个递归&#xff0c;make qemu的时候会报error&#xff0c;error: infinite recursion detected [-Werrorinfinite-recursion]&#xff0c;导致编译无法通过。 解决办法&#xff1a; 在Makefile中&#xff0c;找到CFLAGS,找到 -Werror 选项并将其删除…

【App启动速度怎么做控制和优化】学习笔记

App的启动分为冷启动和热启动。以下讲述的是冷启动。 app启动时做了什么&#xff1f; main函数执行前 加载可执行文件&#xff08;.o文件集合&#xff09;加载动态连接库objc运行时初始化处理&#xff0c;包括objc相关类的注册、category的注册、selector唯一性检查等初始化&…

如何从零开始设计一套⌈中性策略回测系统⌋?

最近接到新任务&#xff0c;需要开发一套⌈中性策略回测系统⌋。 首先老实交待&#xff0c;策略方面&#xff0c;更多是投研部的工作&#xff0c;我不太懂。中性策略&#xff0c;平时工作中多多少少有些接触&#xff0c;全名为市场中性策略&#xff0c;我理解&#xff0c;凡是…

NAT技术

网络技术深似海呀&#xff0c;一段时间不用又忘。 是什么 NAT技术是网络防火墙技术的一部分&#xff0c;可以作用在linux防火墙或者设备防火墙&#xff0c;NAT技术可以实现地址和端口的转换&#xff0c;主要还是为了网络连通性。 作用 存在以下三个IP&#xff0c;A(10.234.…

cartographer代码学习-概率栅格地图(栅格地图的更新)

在cartographer中&#xff0c;地图的更新是很重要的一部分内容&#xff0c;如何将一帧一帧的激光点云转换成子图&#xff0c;则是其中的核心部分。 栅格地图的更新流程 根据前面所学&#xff0c;我们知道在local_trajectory_builder_2d中&#xff0c;函数在对点云预处理后调用…

LeetCode 热题 HOT 100(P31~P40)

系列文章&#xff1a; LeetCode 热题 HOT 100(P1~P10)-CSDN博客 LeetCode 热题 HOT 100(P11~P20)-CSDN博客 LeetCode 热题 HOT 100(P21~P30)-CSDN博客 LeetCode 热题 HOT 100(P31~P40)-CSDN博客 LC76minimum_window . - 力扣&#xff08;LeetCode&#xff09; 题目&…

自动化测试-web(PO:Page Object 模式)

一、PO模式 PO&#xff1a;Page Object&#xff08;页面对象&#xff09;&#xff0c;将自动化涉及的页面或模块封装成对象。 PO能解决什么问题&#xff1f; 代码复用性便于维护&#xff08;脚本层与业务分离&#xff09;--如果元素信息发生变化了&#xff0c;也不用去修改脚…

HOT100打卡—day12—【回溯】—最新24.4.14(剩好多题)

1 46. 全排列 46. 全排列 AC代码&#xff1a; class Solution { public:bool vis[22];vector<vector<int>> permute(vector<int>& nums) {vector<vector<int>> ans;vector<int> now;dfs(0,nums,now,ans);return ans;}void dfs(int …

leetcode经典困难题-接雨水

. - 力扣&#xff08;LeetCode&#xff09; 42. 接雨水 困难 相关标签 相关企业 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,…

c++的学习之路:22、多态(1)

摘要 本章主要是说一些多态的开头。 目录 摘要 一、多态的概念 二、多态的定义及实现 2.1、多态的构成条件 2.2、虚函数 2.3、虚函数的重写 2.4、C11 override 和 final 2.5、重载、覆盖(重写)、隐藏(重定义)的对比 三、思维导图 一、多态的概念 多态的概念&#…

HCIP实验:MGRE、星型拓扑

一、实验要求 1&#xff0c;R6为ISP只能配置IP地址&#xff0c;R1-R5的环回为私有网段 2&#xff0c;R1/4/5为全连的MGRE结构&#xff0c;R1/2/3为星型的拓扑结构&#xff0c;R1为中心站点 3&#xff0c;所有私有网段可以互相通讯&#xff0c;私有网段使用OSPF完成。 二、实验…

数字乡村创新实践探索农业现代化与农村治理现代化新路径:科技赋能农村全面振兴与农民幸福生活

目录 引言 一、数字乡村与农业现代化 1、智慧农业技术的应用 2、农业产业链的数字化转型 二、数字乡村与农村治理现代化 1、农村信息化水平的提升 2、农村治理模式的创新 三、科技赋能农村全面振兴与农民幸福生活 1、提升农业生产效益与农民收入 2、促进农村产业结构…

SpringCloud系列(2)--SpringCloud和SpringBoot技术选型

前言&#xff1a;SpringCloud是微服务架构的一揽子解决方案&#xff0c;SpringBoot是一种技术&#xff0c;要使用SpringCloud&#xff0c;也需要使用到SpringBoot&#xff0c;所以要使用SpringCloud时&#xff0c;必须也要考虑到SpringBoot的适配问题 1、查看SpringCloud和与之…

学生管理系统控制台版(java)

首先得先写个Student类&#xff0c;用来存放学生信息 public class Student {private String id;private String name;private int age;private String address;public Student() {}public Student(String id, String name, int age, String address) {this.id id;this.name…

C++面向对象程序设计-北京大学-郭炜【课程笔记(六)】

C面向对象程序设计-北京大学-郭炜【课程笔记&#xff08;六&#xff09;】 1、可变长数组类的实现2、流插入运算符和流提取运算符的重载2.1、对形如cout << 5 ; 单个"<<"进行重载2.2、对形如cout << 5 << “this” ;连续多个"<<&…

大模型日报2024-04-14

大模型日报 2024-04-14 大模型资讯 研究警告&#xff1a;大型语言模型生成内容存在偏见 摘要: UCL的研究者领导的新报告指出&#xff0c;最流行的人工智能&#xff08;AI&#xff09;工具在生成内容时对女性存在歧视。该研究强调了AI在处理语言时的性别偏见问题&#xff0c;提醒…