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]}