Aka*_*ash 3 haskell types instance type-parameter
我浏览了一个you-tube视频,了解到该人使用参数化数据类型声明了一种新的数据类型:
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
Run Code Online (Sandbox Code Playgroud)
我怀疑的是为什么我们需要第一行代码.我做了类似的事情,它仍然有效.我的代码:
data Q = Q Integer Integer Integer Integer
instance Show Q where
show (Q a b c d) = (show a)++" " ++ --code continues for printing
Run Code Online (Sandbox Code Playgroud)
第一行的用途是什么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;
}
}
Run Code Online (Sandbox Code Playgroud)
(是的,我Integer
在Java中知道并不等同Integer
于Haskell,但这不是问题).
现在这限制了我们使用int
s.如果我们想要一个带有s或s 的四元数,可能会出现一个问题.所以这不会非常有效.double
Car
Quad
然而,最初的定义将是Java中的内容:
public class Quad<A> {
private A field1;
private A field2;
private A field3;
private A field4;
public Quad (A field1, A field2, A field3, A field4) {
this.field1 = field1;
this.field2 = field2;
this.field3 = field3;
this.field4 = field4;
}
}
Run Code Online (Sandbox Code Playgroud)
所以你可以使用一个Quad<Integer>
- 或多或少 - 相当于上面的定义Q
.但我可以很容易地与之合作Quad<Double>
并Quad<Car>
构建双打,汽车,马匹的四元数......
现在你可能会认为马的四元数没有任何意义.通常确定四元数超过数字.但是有几种数据结构来表示数字:Integer
s可以 - 顾名思义 - 只代表整数值.也许你想要允许Double
s.此外,Integer
可以表示所有积分值(直到内存耗尽).虽然这当然是一个很好的功能,但它带来了成本:性能.通常需要更多时间对Integer
s 进行计算(即使它们具有相同的值).因此,如果您想提高性能,可以寻找Quad Int16
.
通过使用类型参数,您可以获得一种灵活性:您不必定义与另一个看起来几乎相同的数据类型.
此外,您可以定义 - 如Youtube课程所示 - 键入实例,您可以在其中放置约束a
.所以对于所有可以编辑Quad a
的地方,你可以展示.您还可以对函数设置约束.比如说你想提供一种计算四元组"元素"之和的方法.你可以定义:
a
show
Quad a
sumquad :: Num a => Quad a -> a
sumquad (Q x y z t) = x + y + z + t
Run Code Online (Sandbox Code Playgroud)
所以现在你已经sumquad
为所有 Quad a
类型定义了一个函数,其中a
是Num
类型类的一个实例(因此支持添加).如果我们合作Q
,应该有一个sumquadQ
for Q
,a sumquadQDouble
for QDouble
(假设的data QDouble = QDouble Double Double Double Double
)等等.所以它需要大量的工作,并且会导致代码不那么优雅.
归档时间: |
|
查看次数: |
99 次 |
最近记录: |