哈斯克尔 | 努力理解类型声明和缩写

Jak*_*son 3 haskell types

在我关注的有关 Haskell 的课程中​​,我正在学习类型声明。目前,它正在讨论缩写,我对此感到困惑,而且我无法在网上找到我正在寻找的信息。

它给出了以下示例:

type Pair a = (a, a)
Run Code Online (Sandbox Code Playgroud)

连同一段文字: Abbreviations - new name for existing types

我在文档中看到了一个与上面代码非常相似的示例:

type Name = String
Run Code Online (Sandbox Code Playgroud)

但从中我仍然无法理解上面的例子。

我正在努力理解它试图解释的内容,所以其他人可以为我理解它并给出它在程序中使用的简单示例吗?

Wil*_*sem 7

这是一个类型别名[Haskell wiki]。它通常用于为更复杂的类型命名。

例如,如果您定义一个函数:

sum2 :: Pair Int -> Int
sum2 (x, y) = x + y
Run Code Online (Sandbox Code Playgroud)

然后在幕后,因此决定:

sum2 :: (Int, Int) -> Int
sum2 (x, y) = x + y
Run Code Online (Sandbox Code Playgroud)

类型别名通常用于

  1. 给一个特殊的结构一个更方便的名字;
  2. 缩短复杂的类型;和
  3. 以便于从类型切换。

例如 aString定义为:

type String = [Char]
Run Code Online (Sandbox Code Playgroud)

String因此,A只是一个Char演员列表。但是签名与String关注它与文本数据一起工作的事实。

类型别名通常用于抽象出类型的复杂性。例如,我们可以定义一个类型Operator

type Operator a = a -> a -> a
Run Code Online (Sandbox Code Playgroud)

因此,这是将两个 type 参数映射到 typea值的函数的别名a。如果我们以后想要创建使用此运算符的函数,这很有趣。例如:

maxOperator :: Ord a => Operator a -> Operator a -> Operator a
maxOperator f g x y = max (f x y) (g x y)
Run Code Online (Sandbox Code Playgroud)

这更有可能比以下内容更具可读性:

maxOperator :: Ord a => (a -> a -> a) -> (a -> a -> a) -> (a -> a -> a)
maxOperator f g x y = max (f x y) (g x y)
Run Code Online (Sandbox Code Playgroud)

如果我们以后使用Operator (Operator a),它肯定更具可读性,因此解析为(a -> a -> a) -> (a -> a -> a) -> a -> a -> a

如果您还不完全清楚您将使用什么类型,有时会使用最终类型。例如,如果你正在实现一个包并且你还没有决定使用Floats 或Doubles,你可以定义一个类型别名:

type Scalar = Float
Run Code Online (Sandbox Code Playgroud)

如果您后来改变主意,可以将其重写为type Scalar = Double,并且您使用过的所有地方Scalar现在都将解析为Double

  • 极好的。我现在明白了,它“本质上”是为了让一切变得更可读、更容易理解,并且所有的事情都相关。当然,它为您的最后一个示例添加了功能,但其目的是从不必要的“幕后”内容中抽象出来。谢谢,威廉,现在完全有道理了:) (2认同)