Haskell之旅。创建类型

121 阅读5分钟

[

Jennifer Takagi

](jennifer-takagi.medium.com/?source=pos…)

珍妮弗-高木

关注

1月21日

-

5分钟阅读

[

拯救

](medium.com/m/signin?ac…)

Haskell之旅。创建类型

新的一年,关于我的Haskell之旅的最后一篇文章来了!🚀让我们来学习一下如何在Haskell中创建一个自定义类型吧

在学习我的第一个功能语言时,我有一个很奇妙的经历,它超级有挑战性,实际上我已经有一段时间没有把我的学习时间投入到新的东西上了!一种我从未真正使用过的语言和范式......😵

虽然有更复杂的概念有关的FP宇宙 - 如单体和漏斗 - ,暂时我想结束这一系列的文章,所以我可以写其他科目👽

照片:Duncan KiddonUnsplash

我在学习中一直使用的一些有用的链接:
(1) 基于这些书学习概念。Haskell函数式编程入门》和《学好你个Haskell大好事!📚
**(2)**在这个Notion文档上做笔记 📝
(3) 在我的GitHub资源库上编码一些练习 🗃

创建一个类型

我已经在以前的文章中写过关于Haskell 数据类型的内容......但这种语言最酷的地方在于我们可以创建一个新的类型!也许乍一看,这个功能并没有什么意义,但让我们跳到一个例子。

我们想建立一个将温度从一个单位转换为摄氏度的程序**,使用Haskell解决这个问题的好方法是将自定义类型模式匹配**相结合。我们可以按以下方式解决。

将任何温度单位转换为摄氏度的程序。

理解魔术:
(1)在第一行,我使用关键字创建了新的类型***"数据";
(2) 一个 新的
类型被称为 "和类型";
**(3)**创建的
类型的值被称为
"值构造器"**,在这种情况下,它们是。"摄氏度或华氏度或开尔文" - **"|"**可以读作 "或";
(4) 然后我可以使用
模式匹配
并创建
函数* ,将一个单位转换为摄氏度。注意,我得到的是双倍"温度" 值--*模式匹配正被应用于"温度 "***值。

为了说明问题,在下面的shell命令中,由于我创建了新的"***温度"***数据类型,我可以验证 值构造器 类型"Celsius "是Temperature!🌡

显示 "值构造器 "的类型的外壳

构造函数的字段

再深入地挖掘一下 "值构造函数",它们也可以有字段!为了在实践中理解这一点,让我们考虑一下,我们需要创建一个程序**,验证任何名称是否有效--验证非常简单,只需检查收到的参数是否为空字符串**。

验证一个名字是否有效的程序。

从每一行中获得想法:
(1) 在第一行中我创建了一个新的类型***"有效";
(2) 这个新
类型*有两个 值构造器,但第一个
"是 "有一个字符串 字段**,它可以接受一个参数!;
(3) 检查 **"isValidaName"**函数: 第一个模式接收一个名字(作为字符串),并返回值 "Yes name received";
**(4)**第二个模式: 如果函数没有接收到一个有效的字符串值(一个数字,一个空字符串...),它返回值"No"。🙈

记录语法

还有一种方法可以声明新的类型,使用 记录语法- 这种方式比较复杂,在有很多值的情况下很有用,或者你只是想让你的新类型更清楚地表达出你的期望。

这种语法允许我们从值 构造器中提取字段,像一个 获取器.它看起来有点混乱,但实际上很简单,我们只需要给 构造函数字段命名。

为了尽可能地简化,我们的代码要解决的新问题是:创建一个程序,将一笔钱从一种货币转换为美元:🤑

理清思路:
(1)在创建了***"兑换"*** 类型后,我又创建了 "货币"类型 它看起来像一个对象或字典或哈希-- **有键(value,currency)和它们的类型(Double,Exchange);
(2)使用
模式匹配
有点不同:我们得到"货币"**类型,我们可以访问该类型的每个,我使用货币进行匹配,并获得作为
"val
**"来进行实际转换。
**(3)**最后,为了使用这个程序,我们调用函数为。

convertDollar Money{value = 2, currency = Real}

奖励:类型分类

你可能已经注意到,在这篇文章的所有例子中,在创建一个新类型的最后,有一个 "派生显示".

"Show "是一个 "Typeclass",我们可以把它看作是一个接口--因为它最终为某些东西提供了一些共同的行为。

简而言之,如果一个类型是 "Typeclass "的一部分,就意味着它支持并实现了 "Typeclass "描述的行为。

有许多 "Typeclass",如Eq, Show, Read, Num, Fractional, Real, Integral, Enum, Ord等等。

但是为了理解为什么所有创建的类型都来自于 "显示",这 "Typeclass" 涵盖了到目前为止所有的类型,除了函数--它接收一个类型为"显示*"*的成员的值,并将其作为一个字符串呈现给我们。📖

就这样吧,伙计们!我真的希望这一系列的文章能够帮助你迈出Haskell的第一步我在编写和研究这门神奇的语言时学到了很多。🥳

我愿意接受可能出现的关于下一篇文章的建议......我相信我将回到关于JavaScript和关于有助于我作为一个开发者的职业生涯的主题的写作。

再见,保重 🤓