宝箱

宝箱

学习练习

简介

泛型

一个类型如果可以使用类型参数容纳任意类型的值,那么它就是泛型类型。

例如,下面这个Box类型的类型参数是a(用小写字母写出)。

pub type Box(a) {
  Box(a)
}

a类型参数是任意类型的占位符,所以Box可以用于字符串、整数或其他任何类型。

Box("Hello, Joe!") // The type is Box(String)

Box(42) // The type is Box(Int)

一个类型可以有多个类型参数,它们之间用逗号分隔。

pub type Pair(a, b) {
  Pair(a, b)
}

泛型函数

类型参数也可以用在函数的形参中。

下面这个函数接受一个a类型的值,并把一个接受a、返回b的函数调用两次。

pub fn twice(value: a, f: fn(a) -> b) -> b {
  f(value)
  f(value)
}
// The type is fn(String, fn(String) -> Nil) -> Nil
twice("Hello, Joe!", io.println)

说明

在这个练习中,你将编写一个泛型(也可以说是充满魔法!)TreasureChest,用来存放宝藏。

1. 定义 TreasureChest 泛型自定义类型

定义一个只有单个变体的TreasureChest自定义类型。

该变体应带有一个关联的String值,用来存放宝箱的密码。

该变体还应带有一个关联的泛型值,用来存放宝藏。 这个值是泛型的,因此宝藏可以是任何东西。

2. 定义 UnlockResult 类型

定义一个UnlockResult自定义类型,它有两个变体。

第一个变体是Unlocked,应持有一个泛型值,用来存放宝藏。

第二个变体是WrongPassword,它不持有任何值。

3. 定义 get_treasure 函数

这个函数应接收两个参数:

  • 一个TreasureChest泛型自定义类型
  • 一个String(用于尝试输入密码)

这个函数应将传入的密码尝试与TreasureChest中的String进行比对。

这个函数应返回一个UnlockResult。

如果密码匹配,就返回Unlocked,并带上TreasureChest中的泛型值(也就是宝藏!)。

如果密码不匹配,就返回WrongPassword。

通过 GitHub 编辑 链接将在新窗口或新标签页中打开
Gleam Exercism

准备好开始 宝箱 了吗?

注册 Exercism,借助 33 个概念122 个练习 和真人导师指导,学习并掌握 Gleam,全部免费。