2010-12-21 44 views
8

我需要帮助理解来自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类型的线程,但我不确定是否描述了一个关系适用于第一个参数,或者整个函数,或者谁知道......

在其他情况下,我已经看到存在的量化,这句话以一个句点结束,但在这里以 - >结尾,这是否意义重大?

回答

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

+0

我想我已经明白了。你开始的类型签名的其余部分是:(f a b) - > Thrist g b c - >(f a c)。如果是这样,我想他们可以一样轻松$>等。 – 2010-12-21 06:32:58

+0

@Jonathan Fischoff:是的。使用的符号只是暗示性的,很像传统的'm'用于一个类型变量,可能是Monad的一个实例。 – 2010-12-21 06:35:29