Haskell术语:类型签名的一部分
Haskell中的许多类型签名采用以下形式:Haskell术语:类型签名的一部分,haskell,Haskell,Haskell中的许多类型签名采用以下形式: a :: (B) => C 据我所知,术语“类型签名”指的是整个构造a::(B)=>C,而B(如果存在)称为“约束”。但是,我不知道如何明确地引用类型签名的其余部分,C 位于任何约束右侧的类型签名部分是否有标准名称? 几次天真的搜索一无所获。到目前为止,这里是我最好的尝试,但最好有一个既简洁又明确的术语: “任何约束之后的类型签名部分” “类型签名的无约束部分” 在某些情况下,从上下文中可以清楚地看到“类型签名的剩余部分” 为了让这更具体
a :: (B) => C
据我所知,术语“类型签名”指的是整个构造a::(B)=>C
,而B
(如果存在)称为“约束”。但是,我不知道如何明确地引用类型签名的其余部分,C
位于任何约束右侧的类型签名部分是否有标准名称?
几次天真的搜索一无所获。到目前为止,这里是我最好的尝试,但最好有一个既简洁又明确的术语:
- “任何约束之后的类型签名部分”
- “类型签名的无约束部分”
- 在某些情况下,从上下文中可以清楚地看到“类型签名的剩余部分”
mapM :: Monad m => (a -> m b) -> [a] -> m [b]
相对于上面使用的符号,标识符mapM
对应于a
,约束Monad m
对应于B
,并且(a->mb)->[a]->m[B]
对应于C
。我在寻找一个单词/短语,它明确地引用了=>
之后的类型签名部分,即(a->mb)->[a]->[b]
当我想到“类约束”时,我想到了出现在类定义左侧的“超类约束”:
class (Functor a) => Applicative a
我把函数上的约束称为“约束”。在这两种情况下,约束实际上不需要来自类。例如,我们可以有等式约束:
f :: (a ~ Int) => a -> a -> a
你提到的“C”部分(在上面的例子中,
a->a->a
)被称为“头部”(如中所示)。实际上,这并没有回答问题。我认为它回答了问题。他问“C”部分是什么。您想提出改进建议吗?您示例中的C
是较大类型(a~Int)=>a->a->a
中的部分a->a
,而不是部分(a~Int)
。OP将C
用于类型中=>
的右侧,而字母C
通常用于左侧。“Head”已经非常超载了。。。为了消除歧义,你会说“类型签名的头部”这样的话吗?此外,你能提供任何链接,显示“头”正在以你建议的方式使用吗?搜索“Haskell类型头签名”似乎不会产生很多相关结果。@Eric感谢更新。看起来这个术语是特定于受约束实例声明的RHS的,在RHS中,语义有很大不同。(据我所知,受约束实例声明的RHS是一个类型类,后跟一个或多个类型,而受约束类型签名的RHS只是一个裸类型/无约束类型。)正因为如此,而且我还没有发现任何“head”用于类型签名的示例与用于实例声明的方式相同,我会小心使用这个术语。但是知道它存在是件好事。Show a=>a->a
被称为类型。事情也是如此。传统上,“类型”一词指的是类型的事物。例如,可能
不是一个类型,而是一个类型构造函数(它的种类是*->*
)。例如,也不显示一个
(其种类是约束
,即类约束的种类)。然而,根据具体情况,使用“类型”来指代任何种类的事物是完全有效的(即种类的类型*
,种类的类型约束的类型,等等)。如果您需要明确说明,Show a
是一个“约束”或“上下文”;a->a
是一个“类型”。而对于所有类型。显示a=>a->a
是一个多类型(空间不足)。这种语言不是通用的,但出现在许多地方,例如类型系统的形式规范。可能没有广泛使用的术语。例如,Haskell报告说,“一般来说,我们使用cx表示上下文,我们写cx=>t表示受上下文cx限制的类型t。”使用非常通用的术语“类型”。这是一种特殊的GHC命名法,但在a的类型中。(Show b,Read c)=>d
,完整的东西被称为sigma类型,(Show b,Read c)=>d
是rho类型,(Show b,Read c)
是θ类型,d
是tau类型。