1

假设我有一个函数map zipWith,我如何确定它的类型?鉴于 is 的类型和is的zipWith类型(a -> b -> c) -> [a] -> [b] -> [c]map(a -> b) -> [a] -> [b]

同样,我如何确定函数的类型zipWith sum

4

3 回答 3

5

:t如其他答案中所述,您可以使用 来检查 GHCi 中的类型。如果您想尝试自己弄清楚,则需要根据需要替换类型。在您的第一个示例中,我们有

zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]

map :: (a -> b) -> [a] -> [b]

的第一个参数map是一个参数的函数,因此我们必须将其zipWith视为这样的函数:

zipWith :: (a -> b -> c) -> ([a] -> [b] -> [c])

(上面的类型等价于原来的类型。这意味着zipWith将一个接受类型参数的函数转换为一个接受ab列表的函数ab

map也可以看作是一个参数的函数:

map :: (a -> b) -> ([a] -> [b])

现在,我们在map的结果类型中填写类型 - abecomea -> b -> cbbecome [a] -> [b] -> [c]

map zipWith :: [a -> b -> c] -> [[a] -> [b] -> [c]]

PS:你真的想要将函数列表作为参数的函数吗?如果您只想压缩两个列表,添加您想要的相应元素

 zipWith (+) :: Num c => [c] -> [c] -> [c]

而不是zipWith sum.

于 2013-10-10T06:43:50.967 回答
1

你可以在 ghci 中看到它的类型:

ghci> :t map zipWith
map zipWith :: [a -> b -> c] -> [[a] -> [b] -> [c]]

同样对于zipWith sum

ghci> :t zipWith sum
zipWith sum :: Num (b -> c) => [[b -> c]] -> [b] -> [c]
于 2013-10-10T06:21:39.373 回答
0

这就是它的ghci用途!或者你可以使用tryhaskell.org

> :t map zipWith
:: [a -> b -> c] -> [[a] -> [b] -> [c]]
于 2013-10-10T06:22:56.097 回答