了解复杂类型签名

时间:2010-12-21 06:18:51

标签: haskell syntax types

我需要帮助理解来自Thrist包的这种类型签名。

import Prelude hiding ((.), id)
import Control.Category
import Data.Monoid
import Control.Arrow
import Control.Monad

foldlThirst :: (forall j k . (a +> j) -> (j ~> k) -> (a +> k))  
               -> (a +> b) 
               -> Thrist (~>) b c  
               -> (a +> c)

我对几件事感到困惑。

首先是什么是+>和〜>符号?他们在哪里记录,他们叫什么?

但我的困惑确实就此止步。我意识到量化是描述Thrist类型的线程,但我不确定是否描述了第一个参数或整个函数的关系,或者谁知道......

在我看过存在量化的其他情况下,这个短语以句号结尾,但这里以 - >结尾,是否显着?

1 个答案:

答案 0 :(得分:8)

  

首先是什么是+>和〜>符号?他们在哪里记录,他们叫什么?

它们是中缀标识符,就像您将它们用作函数的名称一样。出于同样的原因,等同于小写标识符(与以:开头的运算符相比,它们等同于大写字母数字标识符),在类型签名中它们只是类型变量。换句话说,它等同于:

(forall j k . (f a j) -> (g j k) -> (f a k)) 
  -> etc . . .
  

但我的困惑确实就此止步。我意识到量化是描述Thrist类型的线程,但我不确定是否描述了第一个参数或整个函数的关系,或者谁知道......

显式量词的范围仅限于括号内或表达式的末尾。在这种情况下,它们仅描述第一个参数,因为引入的类型变量仅在该参数的范围内。

在这种情况下,它只是意味着作为第一个参数给出的函数在这些类型中必须是完全多态的。例如,类型签名以(a -> a) -> ...开头的函数可以作为其第一个参数not,将aBool统一起来。相反,如果类型签名以(forall a. a -> a) -> ...开头,则需要一个适用于所有可能类型a的函数,唯一的函数是id