当前位置: 首页 > 编程日记 > 正文

《Two Dozen Short Lessons in Haskell》学习(八)- Function Types, Classes, and Polymorphism

《Two Dozen Short Lessons in Haskell》(Copyright © 1995, 1996, 1997 by Rex Page,有人翻译为Haskell二十四学时教程,该书如果不用于赢利,可以任意发布,但需要保留他们的copyright)这本书是学习 Haskell的一套练习册,共有2本,一本是问题,一本是答案,分为24个章节。在这个站点有PDF文件。几年前刚开始学习Haskell的时候,感觉前几章还可以看下去,后面的内容越来越难以理解。现在对函数式编程有了一些了解后,再来看这些题,许多内容变得简单起来了。

初学Haskell之前一定要记住:

把你以前学习面向过程的常规的编程语言,如Pascal、C、Fortran等等统统忘在脑后,函数式编程完全是不一样的编程模型,用以前的术语和思维来理解函数式编程里的概念,只会让你困惑和迷茫,会严重地影响你的学习进度。

这个学习材料内容太多,想把整书全面翻译下来非常困难,只有通过练习题将一些知识点串起来,详细学习Haskell还是先看其它一些入门书籍吧,这本书配套着学学还是不错的。

第八章 Function Types, Classes, and Polymorphism

函数有类型,它的参数有类型,返回值也有类型。函数类型的定义如下:

haskell_type_declaration

多态能够用同一个函数作用在不同的参数上,比如reverse函数,可以把一列整数反序,也可以把一列字符串反序。

1 Polymorphic functions

a change the types of their arguments

b combine data of different types

c can operate on many types of arguments

d gradually change shape as the computation proceeds

2 The function toUpper takes a letter of the alphabet (a value of type Char) and delivers the upper-case version of

the letter. What is the type of toUpper?

a polymorphic

b Char -> Char

c lower -> upper

d cannot be determined from the information given

3 A value of type [a] is

a a sequence with elements of several different types

b a sequence with some of its elements omitted

c a sequence whose elements are also sequences

d a sequence whose elements are all of type a

4 A function of type [a] -> [[a]] could

a transform a character into a string

b deliver a substring of a given string

c deliver a string like its argument, but with the characters in a different order

d transform a string into a sequence of substrings

5 Suppose that for any type a in the class Ord, pairs of values of type a can be compared using the operator <.

A function of type Ord a => [a] -> [a] could

a rearrange the elements of a sequence into increasing order

b deliver a subsequence of a given sequence

c both of the above

d none of the above

6 Suppose Ord is the class described in the preceding question. What is the type of the operator <.

a Ord a => a -> a -> Bool

b Ord a => a -> Bool

c Ord a => a -> Char

d Ord a => a -> [Char]

7 The equality class

a includes all Haskell types

b is what makes functions possible

c is what makes comparison possible

d excludes function types

8 A function with the type Eq a => a -> Bool

a requires an argument with the name a

b delivers True on arguments of type a

c is polymorphic

d must be equal to a

9 If the type of f has three arrows in it, then the type of f x has

a one arrow in it

b two arrows in it

c three arrows in it

d four arrows in it

10 A polymorphic function

a has more than one argument

b has only one argument

c may deliver values of different types in different formulas

d can morph(改变) many things at once

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

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

1 c

多态函数并不改变它的参数的类型,haskell是类型要求严格的语言,它的参数接受进来是什么类型,就是什么类型,不能动态改变。

combline data of different types,多态函数并不负责将多种类型的数据组合在一起,后面讲的tuple元组能够完成这个任务。

haskell中的多态感觉与C#等高级语言中的泛型差不多,例如C#中List <T>中的T代表任意的一种class,而haskell中的函数定义reverse :: [a] -> [a],其中的a也是代表任意一种类型,所以选c。

多态函数在计算过程中并不改变形态。

2 b

toUpper只能接受Char类型的数值,并且得到Char类型(大写字母)的数值,所以类型就是Char –> Char

3 d

在类型定义里[a]表示一个列表,其中每个元素是一种类型Type,这个类型称为a。如果a是Char类型,那么[a]就是[Char],如果a是Int,那么[a]就是[Int],由于[a]是一个列表,所以它里面的元素一定都是同一种类型。

4 d

函数定义:[a]->[[a]],如果a代表Char,则输入参数的类型是[Char],即一个字符串String,而输出类型就是[[Char]],也就是[String],即一个列表,列表中的元素是字符串。

5 c

在Haskell中有2个术语,type和class,type对应于c#语言中的类class,而class对应于C#于的接口interface。

Ord是Haskell中的一个可用于比较的类,有点类似于C#中的IComparable接口。

对于属于Ord中的类型a和b,两者是可以比较大小的。

一个函数的类型是:Ord a => [a] -> [a]

比如这个函数名叫f,完整的函数声明应该是:

f :: Ord a => [a] -> [a]

这种函数声明类似于C语言中的函数声明,告诉编译器这个函数接受几个参数、参数的类型、函数的返回类型等。

在::之前是函数名称,函数声明里出现a, b, c ...,表示这是一个多态函数,在=>之前的Ord a表示a这种类型Type必须可以比较大小。

[a] -> [a]表示接受一个参数,这个参数是一个列表,列表中的元素可以排序。返回值也是一个列表,列表中的元素当然也支持排序。

所以这个函数能够得到一个列表,列表中的元素可以排序,也可以是列表的子列表。

6 a

Ord中的类型可以比较大小,函数(<)接收2个输入参数,返回布尔值。

在ghci中运行:type (<)

得到:

(<) :: Ord a => a -> a -> Bool

7 d?

这个题的答案是d,但我选的是c,暂时还没弄明白。

8 c

Eq a => a –> Bool 这里面有a这样的符号,表示是一种多态函数,a是一种Eq中的一种类型。这个函数接收一个参数,这个参数可以判断是否与其它实例相等(即可以进行'=='这种运算符操作),返回值是一个布尔值。

书中判断回文的函数就是这种函数:

isPalindrome :: Eq a => [a] –> Bool

isPalindrome phrase = (phrase == reverse phrase)

由于这是个多态函数,所以不仅仅是字符串"abcba"的回文判断,[1,2,3,2,1]这样的数字列表也是回文。

9 b

f有三个箭头,则f x的类型就有两个箭头。

举个例子:

f :: Char –> Char –> Char –> [Char]

f x y z = [ x, y, z]

这个函数可以把三个字符连接成一个字符串,有3个箭头。

那么f x 就只能再接受2个参数,所以其类型定义只有2个箭头。

f x :: Char –> Char –> [Char]

10 c

多态函数与参数个数没有关系

多态函数可以应用于不同的类型,此时的返回类型也可能不同。

《Two Dozen Short Lessons in Haskell》学习(一)Hello World

《Two Dozen Short Lessons in Haskell》学习(二)Definitions

《Two Dozen Short Lessons in Haskell》学习(三)How to Run Haskell Programs

《Two Dozen Short Lessons in Haskell》学习(四)List Comprehensions

《Two Dozen Short Lessons in Haskell》学习(五)Function Composition and Currying

《Two Dozen Short Lessons in Haskell》学习(六)Patterns of Computation – Composition, Folding, and Mapping

《Two Dozen Short Lessons in Haskell》学习(七)- Types

《Two Dozen Short Lessons in Haskell》学习(八)- Function Types, Classes, and Polymorphism

《Two Dozen Short Lessons in Haskell》学习(九)- Types of Curried Forms and Higher Order Functions

《Two Dozen Short Lessons in Haskell》学习(十)- Private Definitions — the where-clause

《Two Dozen Short Lessons in Haskell》学习(十一)- Tuples

《Two Dozen Short Lessons in Haskell》学习(十二) 数值相关的类

《Two Dozen Short Lessons in Haskell》学习(十三)迭代及重复的常规模式

《Two Dozen Short Lessons in Haskell》学习(十四)截断序列和惰性求值

《Two Dozen Short Lessons in Haskell》学习(十五)- Encapsulation — modules

《Two Dozen Short Lessons in Haskell》学习(十六)- Definitions with Alternatives

《Two Dozen Short Lessons in Haskell》学习(十七) - 模块库

《Two Dozen Short Lessons in Haskell》学习(十八) - 交互式键盘输入和屏幕输出

《Two Dozen Short Lessons in Haskell》学习(十九) - 文件输入与输出

《Two Dozen Short Lessons in Haskell》学习(二十)- 分数

《Two Dozen Short Lessons in Haskell》学习(二十一)- 在形式参数中使用模式匹配

《Two Dozen Short Lessons in Haskell》学习(二十二)- 递归

第23章没有习题。

《Two Dozen Short Lessons in Haskell》(二十四)代数类型

相关文章:

图神经网络快速爆发,最新进展都在这里了

译者 | 刘畅出品 | AI科技大本营&#xff08;rgznai100&#xff09;近年来&#xff0c;图神经网络&#xff08;GNNs&#xff09;发展迅速&#xff0c;最近的会议上发表了大量相关的研究论文。本文作者正在整理一个GNN的简短介绍和最新研究报告的摘要。希望这对任何准备进入该领…

css去掉a标签点击后的虚线框

outline是css3的一个属性&#xff0c;用的很少。 声明&#xff0c;这是个不能兼容的css属性&#xff0c;在ie6、ie7、遨游浏览器都不兼容。 outline控制的到底是什么呢&#xff1f; 当聚焦a标签的时候&#xff0c;在a标签的区域周围会有一个虚线的框&#xff0c;这个框不同于bo…

在SQL Server中保存和输出任意类型的文件

我们可以把任意类型的文件保存到SQL Server中&#xff0c;在进行例子之前&#xff0c;先建立测试用表格&#xff0c;TestFile.sql&#xff1a;if exists (select * from dbo.sysobjects where id object_id(N[dbo].[TestFiles]) and OBJECTPROPERTY(id, NIsUserTable) 1) dro…

工作中InnoDB引擎数据库主从复制同步心得

近期将公司的MySQL架构升级了&#xff0c;由原先的一主多从换成了DRBDHeartbeat双主多从&#xff0c;正好手上有一个电子商务网站新项目也要上线了&#xff0c;用的是DRBDHeartbeat双主一从&#xff0c;由于此过程还是有别于以前的MyISAM引擎的&#xff0c;所以这里也将其心得归…

面试官:因为这个语言,我淘汰了90%的人!

很多人都有这样的经历&#xff1a;大量重复性工作&#xff1b;日报、周报、各种报&#xff0c;无穷无尽&#xff1b;不计其数的数据提取琐碎繁杂的事务让工作的效率极低。如果可以一键完成就好了。对这些问题来说&#xff0c;最高效的解决途径就是 Python。1991 年&#xff0c;…

SQL Server不能启动

SQL Server不能正常启动 I had a similar issue after uninstalling Visual Studio 2010 (which autmatically came with a Visual Studio Express 2013 install). I solved it by going through the follwing steps. Installing Visual Studio 2010 shell from here: https://…

ASP.NET 配置节架构

ASP.NET 配置节架构包含控制 ASP.NET Web 应用程序行为的元素。如果为属性指定了默认值&#xff0c;则该默认值是在 Machine.config 文件中设置的&#xff0c;该文件的路径是 systemroot/Microsoft.NET/Framework/versionNumber/CONFIG/Machine.config。 <configuration>…

IEEE迎来首位华人主席,马里兰大学终身教授刘国瑞当选

10月12日&#xff0c;IEEE宣布马里兰大学终身教授刘国瑞&#xff08;K. J. Ray Liu&#xff09;当选为2021年IEEE主席&#xff0c;他也是首位当选IEEE主席的华人学者&#xff0c;他将在明年1月开始接任现任IEEE主席Susan K. Kathy Land的职务。 在此次IEEE候选主席竞选中&#…

Visual C++ 2010 简介

VC是用来创建基于 Microsoft Windows 和 Microsoft .NET 的应用程序 原文地址&#xff1a;http://msdn.microsoft.com/zh-cn/library/60k1461a%28vvs.100%29.aspx提供了强大而灵活的开发环境&#xff0c;用于创建基于 Microsoft Windows 和 Microsoft .NET 的应用程序。您可以在…

Linux网络编程:基于UDP的程序开发回顾篇

基于无连接的UDP程序设计 同样&#xff0c;在开发基于UDP的应用程序时&#xff0c;其主要流程如下&#xff1a; 对于面向无连接的UDP应用程序在开发过程中服务端和客户端的操作流程基本差不多。对比面向连接的TCP程序&#xff0c;服务端少了listen和accept函数。前面我们也说过…

四款5G版iPhone 12齐发,苹果股价却应声而跌

整理 | 郑丽媛、屠敏题图 | 东方IC来源 | CSDN&#xff08;CSDNnews&#xff09;真快&#xff0c;又见面了。北京时间 10 月 14 日凌晨 1 点&#xff0c;Apple 举办的新品发布会如约而至。今年有关 iPhone 新品的到来有些迟&#xff0c;好在「5G just got real」&#xff0c;万…

Linux编译器GCC的使用

嵌入式Linux编译器GCC的使用 1、GCC概述 作为自由软件的旗舰项目&#xff0c;Richard Stallman在十多年前刚开始写作GCC的时候&#xff0c;还只是仅仅把它当作一个C程序语言的编译器&#xff0c;GCC的意思也只是GNU C Compiler而已。 经过了这么多年的发展&#xff0c;GCC已经不…

jquery兼容IE和火狐下focus()事件

<input type"text" id"my" name"my" /> <script type"text/javascript">$("#my").focus(); </script> 上面的代码在IE下是没有任何问题的,但是不兼容FF,在FF没有反应解决办法:兼容写法 IE和FF下focus()事…

Access-Control-Allow-Origin这个header这个头不能设置通配符域名

这个header属性&#xff0c;要么设置为*&#xff0c;即任何域名来源都行&#xff0c;要么就只能设置为一个或多个&#xff0c;确定的域名&#xff0c;不能使用通配符域名转载于:https://www.cnblogs.com/abcbuzhiming/p/6478910.html

MySQL Xtrabackup备份和恢复

简介 Xtrabackup是由percona提供的mysql数据库备份工具&#xff0c;据官方介绍&#xff0c;这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具。特点&#xff1a;(1)备份过程快速、可靠&#xff1b;(2)备份过程不会打断正在执行的事务&#xff1b;(3)能够基…

​吐血整理:手拿几个大厂offer的秘密武器!

怎样才能拿到大厂的offer&#xff1f;没有掌握绝对的技术&#xff0c;那么就要不断的学习。如何拿下阿里等大厂的offer呢&#xff0c;今天分享一个秘密武器&#xff0c;资深架构师整理的Java核心知识点&#xff0c;面试时面试官必问的知识点&#xff0c;篇章包括了很多知识点&a…

.NET中获取电脑名,IP地址,当前用户

在.NET中获取一台电脑名&#xff0c;IP地址及当前用户名是非常简单&#xff0c;以下是我常用的几种方法,如果大家还有其它好的方法&#xff0c;可以回复一起整理&#xff1a; 1. 在ASP.NET中专用属性&#xff1a; 获取服务器电脑名: Page.Server.ManchineName 获取用户信息:…

SpringMVC注解整理

2019独角兽企业重金招聘Python工程师标准>>> 使用注解之前要开启自动扫描功能 其中base-package为需要扫描的包(含子包)。 <context:component-scan base-package"cn.test"/> Configuration把一个类作为一个IoC容器&#xff0c;它的某个方法头上如果…

Facebook是如何做搜索的?

作者 | 一块小蛋糕来源 | NewBeeNLP今天要和大家分享的论文是来自Facebook的『Embedding based Retrieval in Facebook Search』。不得不说&#xff0c;F家的文章还是一如既往浓浓的工业风&#xff0c;这篇论文从工程角度讲解了一个召回的全流程&#xff0c;不管是做语义信息检…

JavaScript[对象.属性]集锦

作者&#xff1a; 蓝色理想 SCRIPT 标记? 用于包含JavaScript代码.? 属性? LANGUAGE 定义脚本语言? SRC 定义一个URL用以指定以.JS结尾的文件? windows对象? 每个HTML文档的顶层对象.? 属性? frames[] 子桢数组.每个子桢数组按源文档中定义的顺序存放.? feames…

c++ hook 钩子的使用介绍

一、基本概念&#xff1a; 钩子(Hook)&#xff0c;是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息&#xff0c;而且所监视的窗口可以是其他进程所创建的。当消息到达后&#xff0c;在目标窗口处理函数之前处理它。钩子机制允许应用程序截…

小程序一次性上传多个本地图片,上拉加载照片以及图片加载延迟解决之道

一&#xff1a;小程序之一次性上传多个本地相片 最近由于项目需要所以学了下小程序&#xff0c;也做了一些东西&#xff0c;随后便有了以下的一些总结了&#xff0c;现在说说如何使用小程序一次性上传多个本地相片。 问题描述 最近做项目的时候要实现一个上传相片的功能&#x…

测试项目案例思路

近期帮公司培训部设计测试方向教学案例&#xff0c;原型为我们部门开发的某问卷系统&#xff0c;详情如下&#xff1a; 《**问卷系统》计划授课小时总数为85小时&#xff0c;预计实际授课要根据学生的掌握情况&#xff0c;建议增加5小时&#xff0c;请将此因素考虑到案例使用时…

赠书 | Python人脸五官姿态检测

作者 | 李秋键 出品 | AI科技大本营近几个月来由于疫情的影响使得网络授课得到了快速的发展&#xff0c;人工智能作为最有潜力的发展行业&#xff0c;同样可以应用于网络授课的监督。比如通过检测人脸姿态&#xff0c;眼睛是否张开&#xff0c;鼻子嘴巴等特征&#xff0c;来达到…

明白了这十个故事,你也就参悟了人生

1、断箭   不相信自己的意志&#xff0c;永远也做不成将军。   春秋战国时代&#xff0c;一位父亲和他的儿子出征打仗。父亲已做了将军&#xff0c;儿子还只是马前卒。又一阵号角吹响&#xff0c;战鼓雷鸣了&#xff0c;父亲庄严地托起一个箭囊&#xff0c;其中插着一只箭。…

java中的几种对象(PO,VO,DAO,BO,POJO)

一、PO :(persistant object )&#xff0c;持久对象 可以看成是与数据库中的表相映射的java对象。使用Hibernate来生成PO是不错的选择。二、VO :(value object) &#xff0c;值对象通常用于业务层之间的数据传递&#xff0c;和PO一样也是仅仅包含数据而已。但应是抽象出的业务对…

jquery文件上传控件 Uploadify

基于jquery的文件上传控件&#xff0c;支持ajax无刷新上传&#xff0c;多个文件同时上传&#xff0c;上传进行进度显示&#xff0c;删除已上传文件。 要求使用jquery1.4或以上版本&#xff0c;flash player 9.0.24以上。 有两个版本&#xff0c;一个用flash,一个是html5。html5…

AI 还原康乾盛世三代皇帝的样貌,简直太太太好玩了!

作者 | Jack Cui出品 | AI科技大本营一位 B 站 up 主「Jack Cui」使用 AI 技术&#xff0c;还原了康熙、雍正、乾隆的历史样貌。看看富态的雍正&#xff01;&#xff01;算法实现人工智能技术&#xff0c;可以实现很多有趣而又有意义的事情。 利用 StyleGAN 算法&#xff0c;可…

男人一生中要做的事

作者&#xff1a;未知 请作者速与本人联系揽住母亲的肩头&#xff1a; 每个人都是最棒的&#xff0c;父体的千万个细胞中最强壮的一个才能跑到最前面与来自母体的细胞结合。这时&#xff0c;有二分之一的机会会诞生一个男人。儿子&#xff0c;无疑是父亲所有理想的最好载体&am…

【BZOJ2157】旅游

2157: 旅游 Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 1460 Solved: 656[Submit][Status][Discuss]Description Ray 乐忠于旅游&#xff0c;这次他来到了T 城。T 城是一个水上城市&#xff0c;一共有 N 个景点&#xff0c;有些景点之间会用一座桥连接。为了方便游客到…