1

这是一个可以编译的 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
    

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

4

1 回答 1

6
class Category categ where

这是一个类型类声明,

它声明了一个名为Category. categ是用于引用Category在关联函数中实现的类型的变量。稍后你会填写它,当你说

instance Category Foo where
    ....

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

大声朗读为“如果类型具有以下方法,则类型categ为 a ”Category


现在对于方法:

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

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

于 2013-09-04T03:23:38.537 回答