了解复杂类型签名

Jon*_*off 8 syntax haskell 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)
Run Code Online (Sandbox Code Playgroud)

我对几件事感到困惑.

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

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

在我看到存在量化的其他情况下,这个短语以句点结束,但这里以 - >结束,这是重要的吗?

C. *_*ann 8

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

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

(forall j k . (f a j) -> (g j k) -> (f a k)) 
  -> etc . . .
Run Code Online (Sandbox Code Playgroud)

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

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

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