Haskell 在类型构造函数中,没有箭头的参数意味着什么?
在表达式中Haskell 在类型构造函数中,没有箭头的参数意味着什么?,haskell,type-constructor,Haskell,Type Constructor,在表达式中 data Frank a b = Frank {frankField :: b a} deriving (Show) {frankField::ba}是什么意思 {frankField::ba}是类型构造函数吗?如果是这样,参数是否应该看起来像b->a而不是ba?Frank是一种*->(*->*)->*,也就是说,它采用a(种类*)类型,例如Int,Char,或String;和一元类型构造函数b(种类*->*),例如可能是或字符串。(您可以使用GHCi中的:kind或:k命令检查类
data Frank a b = Frank {frankField :: b a} deriving (Show)
{frankField::ba}
是什么意思
{frankField::ba}
是类型构造函数吗?如果是这样,参数是否应该看起来像b->a
而不是ba
?Frank
是一种*->(*->*)->*
,也就是说,它采用a
(种类*
)类型,例如Int
,Char
,或String
;和一元类型构造函数b
(种类*->*
),例如可能是或字符串。(您可以使用GHCi中的:kind
或:k
命令检查类型的种类。)
它有一个构造函数,也称为Frank
,其中包含一个类型为ba
的字段(不是构造函数),称为frankField
——例如,类型为Frank Int Maybe
的值中frankField
的类型是Maybe Int
,既然b
=可能
和a
=Int
,那么ba
=可能是Int
此定义使用记录符号为字段命名,您也可以只编写数据Frank a b=Frank(b a)
使其匿名,但命名字段的优点是,您可以使用显式记录语法构造Frank
值:
frank1 :: Frank Int Maybe
frank1 = Frank { frankField = Just 1 }
或修改一个值:
frank2 :: Frank Int Maybe
frank2 = frank1 { frankField = Nothing }
或按名称访问字段:
value :: Maybe Int
value = frankField frank1
当构造函数包含多个字段时,这更方便,也更常见;另外,当一个类型只包装一个值时,您通常会看到newtype
而不是data
,因为newtype
的开销较小,惰性语义稍有不同。Frank
是一种*->(*->*->*
,也就是说,它采用了一种a
(属于*
)例如Int
、Char
或String
;和一元类型构造函数b
(种类*->*
),例如可能是或字符串。(您可以使用GHCi中的:kind
或:k
命令检查类型的种类。)
它有一个构造函数,也称为Frank
,其中包含一个类型为ba
的字段(不是构造函数),称为frankField
——例如,类型为Frank Int Maybe
的值中frankField
的类型是Maybe Int
,既然b
=可能
和a
=Int
,那么ba
=可能是Int
此定义使用记录符号为字段命名,您也可以只编写数据Frank a b=Frank(b a)
使其匿名,但命名字段的优点是,您可以使用显式记录语法构造Frank
值:
frank1 :: Frank Int Maybe
frank1 = Frank { frankField = Just 1 }
或修改一个值:
frank2 :: Frank Int Maybe
frank2 = frank1 { frankField = Nothing }
或按名称访问字段:
value :: Maybe Int
value = frankField frank1
当构造函数包含多个字段时,这更方便,也更常见;另外,当一个类型只包装一个值时,您通常会看到newtype
而不是data
,因为newtype
的开销较小,惰性语义略有不同。如果b
是可能
,而不是可能是Int
,但是可能
,而a
是Int
,那么什么是ba
?这叫做“记录”。通常您会看到多个字段,如datat=K{one::Int,two::String,three:[Bool]}
。如果b
是Maybe
,不是Maybe Int
,而是Maybe
,而a
是Int
,那么ba
?这就是一个“记录”。通常您会看到多个字段,如datat=K{one::Int,two::String,three::[Bool]}
。