gpt4 book ai didi

haskell - 为什么在 Haskell 中声明参数化数据类型?

转载 作者:行者123 更新时间:2023-12-02 18:38:39 24 4
gpt4 key购买 nike

我观看了 YouTube 视频,了解到该人使用参数化数据类型声明了一个新数据类型:

data Quad a = Quad a a a a
instance (Show a) => Show (Quad a) where
show (Quad a b c d) = (show a) ++ " " ++ -- code continues for printing

我的疑问是为什么我们需要第一行代码。我做了类似的事情,它仍然有效。我的代码:

data Q = Q Integer Integer Integer Integer 
instance Show Q where
show (Q a b c d) = (show a)++" " ++ --code continues for printing

第一行即 data Quad a = Quad a a a a 有什么用处,而我们可以通过上面所示的方法来完成它?请帮忙。提前致谢!

最佳答案

我不知道您对 Java 这样的命令式编程语言有多熟悉,但我假设您熟悉泛型。现在您对 Q 的定义或多或少相当于 Java 中的某些内容,例如:

public class Q {

private Integer field1;
private Integer field2;
private Integer field3;
private Integer field4;

public Q (Integer field1, Integer field2, Integer field3, Integer field4) {
this.field1 = field1;
this.field2 = field2;
this.field3 = field3;
this.field4 = field4;
}

}

(是的,我知道 Java 中的 Integer 不等于 Haskell 中的 Integer,但这不是问题)。

现在,这限制了我们只能使用int s。如果我们想要一个带有double四元数,可能会出现一个问题,该怎么办? s,或Car s。所以这不会很有效。

Quad的原始定义然而在 Java 中会是这样的:

public class Quad<b><A></b> {

private <b>A</b> field1;
private <b>A</b> field2;
private <b>A</b> field3;
private <b>A</b> field4;

public Quad (<b>A</b> field1, <b>A</b> field2, <b>A</b> field3, <b>A</b> field4) {
this.field1 = field1;
this.field2 = field2;
this.field3 = field3;
this.field4 = field4;
}

}

所以你可以使用Quad<Integer>这或多或少相当于上面 Q 的定义。但我可以轻松地使用Quad<Double>Quad<Car>构造 double 、汽车、马的四元数......

现在您可能会认为马的四元数没有任何意义。四元数通常确实是通过数字来指定的。但是有几种数据结构来表示数字: Integer顾名思义,s 只能代表整数值。也许您想允许 Double也是如此。此外Integer可以表示所有整数值(直到内存耗尽)。虽然这当然是一个不错的功能,但它也有一定的代价:性能。对 Integer 进行计算通常需要更多时间s(即使它们具有相同值)。因此,如果您想提高性能,您可以寻找Quad Int16例如。

通过使用类型参数,您可以实现某种形式的灵 active :您不必定义与另一种数据类型几乎相同的数据类型。

此外,您可以定义 - 就像 Youtube 类(class)所示 - 对 a 施加约束的类型实例。 。所以对于所有人Quad a哪里 a可以是show ed,然后您可以显示 Quad a 。您还可以对函数施加约束。举例来说,您想提供一种方法来计算四边形“元素”的总和。您可以定义:

sumquad :: <b>Num a =></b> Quad a -> a
sumquad (Q x y z t) = x + y + z + t

现在你已经定义了 sumquad 所有的函数 Quad a类型其中 aNum 的一个实例typeclass(因此支持加法)。如果我们与 Q 合作,应该有一个sumquadQ对于 Q ,一个sumquadQDouble对于 QDouble (假设的 data QDouble = QDouble Double Double Double Double )等。因此这需要大量的工作,并且会导致代码不太优雅。

关于haskell - 为什么在 Haskell 中声明参数化数据类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43888968/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com