我正在学习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 x的作用与Frank { frankField = x }相同。

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

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


...然后,这些字段将按照您写入它们的顺序显示,因此您可以执行以下操作:

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

关于haskell - 类型类中的类型与值构造函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27951328/

10-09 05:43