这两个符号在Haskell中有何不同?

Daw*_*n17 0 haskell

我是Haskell的新手,仍然对某些符号感到困惑.

在函数头中,我知道

func :: [Int] -> Int
Run Code Online (Sandbox Code Playgroud)

表示输入是整数列表,输出是整数.

这有什么不同

func :: (Ord a) => [a] -> a
Run Code Online (Sandbox Code Playgroud)

我问,因为它们似乎是相同的,我想知道为什么我们使用不同的符号来表示相同的东西.

Ste*_*ano 5

第一个非常简单,如你所说,它需要一个列表Int并返回一个Int.

但是,第二个可以接受许多不同类型的输入(包括您自己定义的类型).

关键是(Ord a).这就是说它必须是可订购类型的列表,如果它满足该要求,那么它是一个可以传递给这个特定函数的有效类型.

Ord类型类包括以下成员:

  • <
  • <=
  • >
  • >=

所以

func :: (Ord a) => [a] -> a
Run Code Online (Sandbox Code Playgroud)

作为示例,可能是一个获取可订购类型列表并返回该列表的最大成员的函数.这可能是[Int],[Integer],[Float],和许多其他的事情.