假设我有map zipWith
这样的函数,我该如何确定它的类型?鉴于zipWith
的类型为(a -> b -> c) -> [a] -> [b] -> [c]
而map
的类型为(a -> b) -> [a] -> [b]
同样,我如何确定zipWith sum
等函数的类型?
答案 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
将一个带有类型a
和b
的参数的函数转换为一个带有{{1}列表的函数}和a
。)
b
也可以看作是一个参数的函数:
map
现在,我们在map :: (a -> b) -> ([a] -> [b])
的结果类型中填写类型 - map
变为a
,a -> 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]]