如何确定函数的类型?

时间:2013-10-10 06:19:49

标签: haskell types

假设我有map zipWith这样的函数,我该如何确定它的类型?鉴于zipWith的类型为(a -> b -> c) -> [a] -> [b] -> [c]map的类型为(a -> b) -> [a] -> [b]

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

3 个答案:

答案 0 :(得分: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的参数的函数转换为一个带有{{1}列表的函数}和a。)

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

map

现在,我们在map :: (a -> b) -> ([a] -> [b]) 的结果类型中填写类型 - map变为aa -> b -> c变为b

[a] -> [b] -> [c]

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

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

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

答案 1 :(得分: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]

答案 2 :(得分:0)

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

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