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

d12*_*25q 3 haskell typeclass

我正在学习Haskell,并对此示例感到困惑.

考虑以下:

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
Run Code Online (Sandbox Code Playgroud)

为什么在创建Frank实例时Tofu,我们提供(据我所知)一个类型构造函数Frank x,而不是值构造函数,即tofu x = Frank {frankField = x}

por*_*ges 7

你还在使用值构造函数.您可以使用具有记录字段的类型,而无需使用记录语法来构造它们,因此Frank x也是如此Frank { frankField = x }.

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

data Frank a b = Frank { frankA :: a, frankB :: b } 
Run Code Online (Sandbox Code Playgroud)

...然后字段按照您编写的顺序显示,因此您可以执行以下操作:

-- With x :: a, y :: b
Frank x y
Run Code Online (Sandbox Code Playgroud)

  • 是的,一开始可能有点混乱.请记住,如果您在类型签名/类声明/ etc中看到CapitalizedIdentifier,它将是一个类型名称,而其他任何地方都将成为构造函数. (3认同)