试图了解haskell的代码

时间:2013-09-04 02:58:11

标签: haskell

这是一个编译的Haskell代码:

class Category categ where
  method1 :: categ a a
  method2 :: categ a b -> categ b c -> categ a c

但我不明白它的含义:

  1. 什么是categ?如何定义:通过dataclass?也许 这是function
  2. ab以及c是什么?因为它们没有被指定为

    class Category categ a b c where
        method1 :: categ a a
        method2 :: categ a b -> categ b c -> categ a c
    

    这段代码不应该编译,应该吗?

1 个答案:

答案 0 :(得分:6)

class Category categ where

这是一个类型类声明,

它声明了一个名为Category的类型类。 categ是用于引用相关函数中实现Category的类型的变量。稍后您将在填写时填写

instance Category Foo where
    ....

然后,在类型类方法中使用categ的任何地方,替换Foo并定义方法。

如果“类型categCategory,如果它具有以下方法”,请大声朗读“


现在的方法:

method1 :: categ a a
method2 :: categ a b -> categ b c -> categ a c

声明实现Category的任何类型必须实现的2个函数。第一个是无参数函数,对于任何类型a,返回类型categ a amethod2收集两个数据categ a bcateg 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。它是免费的,将涵盖您刚刚发布的代码的所有方面。