如何确定函数的类型?

Has*_*tsy 1 haskell types

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

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

dup*_*ode 5

您可以检查GHCi中的类型:t,如其他答案中所述.如果您想尝试自己搞清楚,您需要根据需要替换类型.在你的第一个例子中,我们有

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

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

第一个参数map是一个参数的函数,所以我们必须将其zipWith视为一个函数:

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

(上面的类型是相当于原来的一个,这意味着zipWith转换一函数,它接受的类型的参数ab到这需要的列表的功能ab.)

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

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

现在,我们填写的类型map的结果类型- a变得a -> b -> cb变成[a] -> [b] -> [c]:

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

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

 zipWith (+) :: Num c => [c] -> [c] -> [c]
Run Code Online (Sandbox Code Playgroud)

而不是zipWith sum.