【发布时间】:2014-05-03 00:43:51
【问题描述】:
我正在尝试导出 zipWith . uncurry 的类型
zipWith . uncurry = (.) zipWith uncurry -- 串联作为函数
(.) :: (b1 -> c1) -> (a1 -> b1) -> a1 -> c1
zipWith :: (a2 -> b2 -> c2) -> [a2] -> [b2] -> [c2]
uncurry :: (a3 -> b3 -> c3) -> (a3, b3) -> c3
b1 ~ (a2 -> b2 -> c2)
c1 ~ [a2] -> [b2] -> [c2]
a1 ~ (a3 -> b3 -> c3)
b1 ~ (a3, b3) -> c3
将a1 替换为(a3 -> b3 -> c3),将c1 替换为[a2] -> [b2] -> [c2] 我得到:
(.) zipWith uncurry :: a1 -> c1 ~ (a3 -> b3 -> c3) -> [a2] -> [b2] -> [c2]
如果我在 GHCi 中查询 :t zipWith . uncurry,我会得到:(a -> b1 -> b -> c) -> [(a, b1)] -> [b] -> [c]
我认为关键在于b1 ~ (a2 -> b2 -> c2) ~ (a3, b3) -> c3,但我不知道如何将我的结果与预期相匹配。
有什么帮助吗?
谢谢,
塞巴斯蒂安。
【问题讨论】:
-
当
zipWith函数使用两个参数时,uncurry有什么好处。zipWith (enumFromTo) [0,2..6] [1,3..7]产生 [[0,1],[2,3],[4,5],[6,7]] 或像zipWith (:) [0,2..6] [[n]|n<-[1,3..7]]一样为其提供适当的参数产生非常相同.(:)的第二个参数必须是一个列表。
标签: haskell types ghci unification