Haskell - 理解 :t [length, head] 定义

GMa*_*nez 3 haskell

做作业时,我发现自己遇到了一个问题。我必须通过统一它们(教授称之为统一它们)从基本类型转变为“更复杂”的类型。地图地图示例:

map :: (c -> d) -> [c] -> [d]

map :: (a -> b) -> [a] -> [b]
Run Code Online (Sandbox Code Playgroud)

通过替换cwith a -> b, dwith[a] -> [b]并省略 map 的第一个参数,结果是[a -> b] -> [[a] -> [b]]haskell 在执行 :t map map 时返回的内容。

在一项练习中,我[length, head]根据 Haskell 中的 :t[length, head] :: [[Int] -> Int]

我在理解[length, head]工作原理时遇到问题。它是一个函数列表?它执行head到一个列表,然后length应用于结果?

我找不到这个工作的例子,每次我尝试输入一个列表或列表列表时[length,head]都会出错。我注意到它[head,length]的类型与[length,head]这并不能帮助我理解它的类型相同。

[length,head]应该如何工作?

Wil*_*sem 7

我在理解[length, head]工作原理时遇到问题。它是一个函数列表?

是的,它是一个包含两个元素的列表,这两个元素都是函数。

它执行head到一个列表,然后length应用于结果?

没有。它只是一个有两个函数的列表,就像你可以有一个包含两个Chars的列表,或者两个Strings,你可以有一个包含两个函数的列表。在 Haskell 中,函数是一等公民,您可以将它们作为参数传递,并将它们作为函数的结果返回。然而,列表中的元素总是属于同一类型。所以这意味着列表中的 thelength和 thehead需要是相同的类型。

这意味着head :: [a] -> a, 和length :: [b] -> Int需要是相同的类型,因此我们可以说[a] -> a[b] -> Int应该是相同的类型。这意味着a ~ Int(由于两个函数的返回类型相同),并且a ~ b(由于两个类型的输入类型相同),因此,两个函数的类型为[Int] -> Int

因此,对于此列表, thehead和 thelength具有 as type [Int] -> Int。因此,这意味着这两个函数的列表具有 type [[Int] -> Int]