类型类中的类型与值构造函数

Type vs. value constructors in typeclasses

我正在学习 Haskell 并且对 this example 感到困惑。

考虑以下几点:

class Tofu t where
    tofu :: j a -> t a j

data Frank a b = Frank {frankField :: b a} deriving (Show)

instance Tofu Frank where
    tofu x = Frank x

为什么当 Frank 成为 Tofu 的实例时,我们提供(据我所知)类型构造函数 Frank x,而不是值构造函数,即 tofu x = Frank {frankField = x}?

您仍在使用值构造函数。您可以使用具有记录字段的类型,而不必使用记录语法来构造它们,因此 Frank xFrank { frankField = x }.

的作用相同

如果您有多个记录字段,例如:

data Frank a b = Frank { frankA :: a, frankB :: b } 

...然后字段将按照您写入的顺序显示,因此您可以:

-- With x :: a, y :: b
Frank x y