繁体   English   中英

类型类在Haskell中如何工作?

[英]How do type classes work in Haskell?

我对haskell中的类感到非常困惑。 如果我有代码:

class GetResult n where res :: n -> Int
class (GetResult n) => Model n where
                                     starting :: Int -> [Int] -> n
                                     starting i j = .....
                                     test :: n -> n
                                     test n = ......

n是什么类型? 开始输出和测试将采用哪种类型作为输入?

您的困惑可能是由于Haskell中的类型类与OO中的类无关。 最重要的是,类型类不描述对象,它们描述类型。

类型类描述了一组方法。 您可以为给定类型实现这些方法,以使该类型成为类的实例。 因此,您对GetResult的类型类定义可以读为“通过实现类型为n -> Int的方法res n -> Int可以将类型n设为GetResult的实例”。 因此, n只是想成为GetResult实例的类型。

例如,如果要使Int成为GetResult的实例,则可以使用以下实例声明:

instance GetResult Int where
    res :: Int -> Int
    res i = i

在这种情况下, n将为Int

n是类型变量,不是任何特定类型。 可以使特定类型成为GetResultModel实例,并且每个实例都将在类中定义的函数类型中“填充空白”。

因此,完整的starting类型是(您可以从ghci中使用:t starting来获得它):

starting :: Model n => Int -> [Int] -> n

您可以将其理解为“对于任何作为Model实例的类型, starting需要一个Int和一个[Int]并返回该类型的值”。 同样, test采用任何作为Model实例的类型,并返回相同类型的值。

在任何特定呼叫starting ,类型返回将由上下文来确定; 它会返回一个与该上下文使用的返回值类型相同的值(假定存在合适的实例)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM