Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
试图理解haskell';s代码_Haskell - Fatal编程技术网

试图理解haskell';s代码

试图理解haskell';s代码,haskell,Haskell,以下是Haskell代码,它编译: class Category categ where method1 :: categ a a method2 :: categ a b -> categ b c -> categ a c 但我不明白它的意思: 什么是categ?如何定义:通过数据或类?大概 这是一个功能 什么是a和b和c?因为它们没有指定为 class Category categ a b c where method1 :: categ a a met

以下是Haskell代码,它编译:

class Category categ where
  method1 :: categ a a
  method2 :: categ a b -> categ b c -> categ a c
但我不明白它的意思:

  • 什么是
    categ
    ?如何定义:通过
    数据
    ?大概 这是一个
    功能
  • 什么是
    a
    b
    c
    ?因为它们没有指定为

    class Category categ a b c where
        method1 :: categ a a
        method2 :: categ a b -> categ b c -> categ a c
    
    这段代码不应该编译,是吗

  • 这是一个类型类声明

    它声明了一个名为
    Category
    的类型类。
    categ
    是用于引用相关功能中实现
    类别的a类型的变量。以后你会在你说

    instance Category Foo where
        ....
    
    然后,在类型类方法中使用
    categ
    的地方,替换
    Foo
    并定义方法

    大声读出来,因为“类型
    categ
    类别
    ,如果它有以下方法”


    现在,关于方法:

    method1 :: categ a a
    method2 :: categ a b -> categ b c -> categ a c
    
    声明实现
    类别
    的任何类型都必须实现的2个函数。第一个是无参数函数,对于任何类型
    a
    ,该函数返回类型
    catega
    method2
    接收两段数据,
    categab
    categbc
    ,并返回
    categac

    这里的
    abc
    是类型变量,它们是在调用函数时用任意具体类型填充的占位符。如果你熟悉C++或java,

    template<typename A>
    categ<A, A> method1();
    
    模板
    卡特。它是免费的,将涵盖您刚刚发布的代码的所有方面

    这是一个类型类声明

    它声明了一个名为
    Category
    的类型类。
    categ
    是用于引用相关功能中实现
    类别的a类型的变量。以后你会在你说

    instance Category Foo where
        ....
    
    然后,在类型类方法中使用
    categ
    的地方,替换
    Foo
    并定义方法

    大声读出来,因为“类型
    categ
    类别
    ,如果它有以下方法”


    现在,关于方法:

    method1 :: categ a a
    method2 :: categ a b -> categ b c -> categ a c
    
    声明实现
    类别
    的任何类型都必须实现的2个函数。第一个是无参数函数,对于任何类型
    a
    ,该函数返回类型
    catega
    method2
    接收两段数据,
    categab
    categbc
    ,并返回
    categac

    这里的
    abc
    是类型变量,它们是在调用函数时用任意具体类型填充的占位符。如果你熟悉C++或java,

    template<typename A>
    categ<A, A> method1();
    
    模板
    
    卡特。它是免费的,将涵盖您刚刚发布的代码的所有方面。

    我在问
    实例类别Foo在哪里
    --如何定义Foo:通过类、数据或其他什么?它可能是函数吗?@MariusKavansky你能解释一下“它怎么可能是函数”的意思吗?@MariusKavansky
    Foo
    必须是一种具体类型(定义为
    data
    newtype
    )类型
    *->*->*
    ,也就是说,它必须有两个类型变量。它可能是函数的类型
    (>)
    ,如果你是这个意思的话。@phg,这正是我的意思。也可能是类吗?不,不是直接的,因为类与类型不同。您可以做的是使一个类的所有实例成为另一个类的实例,比如
    实例Monad m=>Category(Kleisli m)where…
    我在问
    实例Category Foo where
    --如何定义Foo:通过类、数据或其他什么?它可能是函数吗?@MariusKavansky你能解释一下“它怎么可能是函数”的意思吗?@MariusKavansky
    Foo
    必须是一种具体类型(定义为
    data
    newtype
    )类型
    *->*->*
    ,也就是说,它必须有两个类型变量。它可能是函数的类型
    (>)
    ,如果你是这个意思的话。@phg,这正是我的意思。也可能是类吗?不,不是直接的,因为类与类型不同。您可以做的是使一个类的所有实例成为另一个类的实例,比如
    instance Monad m=>Category(Kleisli m),其中…