【问题标题】:Understanding a Complicated Type Signature了解复杂的类型签名
【发布时间】:2011-05-14 01:56:20
【问题描述】:

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

在我看到存在量化的其他情况下,该短语以句号结尾,但这里以 -> 结尾,这很重要吗?

【问题讨论】:

    标签: haskell syntax types


    【解决方案1】:

    首先什么是 +> 和 ~> 符号?它们记录在哪里?它们叫什么?

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

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

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

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

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

    【讨论】:

    • 我想我明白了。您开始的其余类型签名将是:(f a b) -> Thrist g b c -> (f a c)。如果是这样,我想他们可能很容易成为 $> 等。
    • @Jonathan Fischoff:是的。使用的符号只是暗示性的,就像传统上使用 m 来表示预期是 Monad 实例的类型变量一样。
    猜你喜欢
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-11
    • 1970-01-01
    相关资源
    最近更新 更多