我正在学习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}?
你还在使用值构造函数.您可以使用具有记录字段的类型,而无需使用记录语法来构造它们,因此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)