Haskell中类型签名中的... ...-> t a-> ...`是什么意思?

时间:2018-07-29 14:09:23

标签: haskell types

在功能allany的签名中,我看到了这一点:

Prelude> :t all 
all :: Foldable t => (a -> Bool) -> t a -> Bool
Prelude> :t any
any :: Foldable t => (a -> Bool) -> t a -> Bool

但是,... -> t a ->...是什么意思?

ta都不都是类型变量吗?如果是这样,在Haskell中两个类型变量的并置意味着什么?

1 个答案:

答案 0 :(得分:8)

  

t和类型变量都不都是吗?如果是这样,在Haskell中两个类型变量的并置意味着什么?

就像 data 构造函数可以采用 parameters (例如Just)一样, type 构造函数也可以采用参数,这些参数就是类型。例如,Maybe类型构造函数采用类型参数(例如Int),然后是类型Maybe Int

例如,可以使用列表[]来存储元素,但是仍然需要解析一个类型参数:列表将存储的对象的类型。 [] Int[Int]就是Int的列表。

现在Foldable类型是可以折叠的类型。例如,列表[]Foldable(请注意,我们使用[],而不是[a][Int])以及Maybe,或Tree。大多数元素的“集合”都是Foldable,尽管不是集合的类型可以是Foldable,反之亦然。

all :: Foldable t => (a -> Bool) -> t a -> Boolany :: Foldable t => (a -> Bool) -> t a -> Bool是可以在Foldable上运行的函数。这样的好处是,我们可以写allany来对a的列表进行操作(所以[a]),但是可以使用Maybe a以及:您可以看到Maybe是一种类型,它是包含 no 元素(Nothing或完全 one 元素( Just xx元素)。例如,我们可以这样写:

Prelude> all id Nothing
True
Prelude> all id (Just True)
True
Prelude> all id (Just False)
False
Prelude> all id []
True
Prelude> all id [True]
True
Prelude> all id [False]
False
Prelude> all id [False, True]
False
Prelude> all id [True, True]
True

all因此可以用于列表Maybe,但也可以用于许多其他类型。