假设我有一个函数map zipWith,我该如何确定它的类型?鉴于zipWith是(a -> b -> c) -> [a] -> [b] -> [c]和的类型map是(a -> b) -> [a] -> [b]
同样,我如何确定类似的函数类型zipWith sum?
您可以检查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转换一函数,它接受的类型的参数a和b到这需要的列表的功能a和b.)
map 也可以看作是一个参数的函数:
map :: (a -> b) -> ([a] -> [b])
Run Code Online (Sandbox Code Playgroud)
现在,我们填写的类型map的结果类型- a变得a -> b -> c和b变成[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.
| 归档时间: |
|
| 查看次数: |
364 次 |
| 最近记录: |