具有复合/多参数类型构造函数的Haskell类型签名

CMC*_*kai 4 polymorphism haskell types

我发现了这些类型的签名:

x :: a b -> Int
x f = 3

y :: a b c -> Int
y f = 3

z :: a b c d -> Int
z f = 3

> x [1] -- 3
> y (1, 2) -- 3
> z (1, 2, 3) -- 3
Run Code Online (Sandbox Code Playgroud)

基本上:

  1. x只接受一个带有1个参数或更多参数的类型构造函数的值.
  2. y只接受一个包含2个或更多参数的类型构造函数的值.
  3. z只接受一个包含3个或更多参数的类型构造函数的值.

它们是有效的,但我不确定它们的含义以及它们可以用于什么.

它们似乎与类型构造函数上的多类型概念或多态相关,但是基于类型构造函数接受的许多参数强制执行不变量.

lef*_*out 8

没有进一步的限制,这样的类型是无用的 - 没有什么可以真正用它们做,期望正确传递它们.但这实际上与签名的情况相同a -> Int:如果一无所知a,那么你也无能为力!

但是,与例如一样toInteger :: Integral a => a -> Integer,在参数中添加约束可以让你做一些事情.例如,

import Data.Foldable
import Prelude hiding (foldr)

x' :: (Foldable a, Integral b) => a b -> Integer
x' = foldr ((+) . toInteger) 0
Run Code Online (Sandbox Code Playgroud)

而是更多的往往不是,当你有一种形式的a b ... n o p q,那么a b ... p至少是实例Functor类,往往还ApplicativeMonad; 有时Foldable,TraversableComonad; 有时a b ... oArrow...这些约束允许你对复合类型做很多事情,而不知道你正在处理什么类型的构造函数.