假设我有一个函数map zipWith
,我如何确定它的类型?鉴于 is 的类型和is的zipWith
类型(a -> b -> c) -> [a] -> [b] -> [c]
map
(a -> b) -> [a] -> [b]
同样,我如何确定函数的类型zipWith sum
?
: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
列表的函数a
。b
)
map
也可以看作是一个参数的函数:
map :: (a -> b) -> ([a] -> [b])
现在,我们在map
的结果类型中填写类型 - a
becomea -> b -> c
和b
become [a] -> [b] -> [c]
:
map zipWith :: [a -> b -> c] -> [[a] -> [b] -> [c]]
PS:你真的想要将函数列表作为参数的函数吗?如果您只想压缩两个列表,添加您想要的相应元素
zipWith (+) :: Num c => [c] -> [c] -> [c]
而不是zipWith sum
.
你可以在 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]
这就是它的ghci
用途!或者你可以使用tryhaskell.org
> :t map zipWith
:: [a -> b -> c] -> [[a] -> [b] -> [c]]