这是一个编译的Haskell代码:
class Category categ where
method1 :: categ a a
method2 :: categ a b -> categ b c -> categ a c
但我不明白它的含义:
categ
?如何定义:通过data
或class
?也许
这是function
? a
和b
以及c
是什么?因为它们没有被指定为
class Category categ a b c where
method1 :: categ a a
method2 :: categ a b -> categ b c -> categ a c
这段代码不应该编译,应该吗?
答案 0 :(得分:6)
class Category categ where
这是一个类型类声明,
它声明了一个名为Category
的类型类。 categ
是用于引用相关函数中实现Category
的类型的变量。稍后您将在填写时填写
instance Category Foo where
....
然后,在类型类方法中使用categ
的任何地方,替换Foo
并定义方法。
如果“类型categ
是Category
,如果它具有以下方法”,请大声朗读“
现在的方法:
method1 :: categ a a
method2 :: categ a b -> categ b c -> categ a c
声明实现Category
的任何类型必须实现的2个函数。第一个是无参数函数,对于任何类型a
,返回类型categ a a
。 method2
收集两个数据categ a b
和categ b c
,然后返回categ a c
。
这里a b c
是类型变量,它们是在调用函数时填充了任意具体类型的占位符。如果您熟悉C ++或Java,
template<typename A>
categ<A, A> method1();
非常接近Haskell中的内容。在Haskell中,我们只使用类型变量而不声明它们。它们是函数本地的,相当于说出对于任何类型a
,以下代码可以正常工作。
这对Haskell来说非常重要,我建议阅读Learn You A Haskell。它是免费的,将涵盖您刚刚发布的代码的所有方面。