如何制作Curry和Uncurry依赖类型?

时间:2017-05-10 04:52:23

标签: haskell currying dependent-type

我正在阅读Fridlender和Indrika的一篇论文,标题是" Do we need dependent types?"

在结论中,它说"可以应用相同的技术 其他功能,如liftM,zip,unzip,curry,uncurry和tut;"

对于ZipWith,作者定义了(<<<<<<<<>)

(<<) :: [a -> b] -> [a] -> [b]
(f:fs) << (a:as) = f a : (fs << as)
_<<_=[]

然后将zipWith定义为

(repeat f) << as1 << as2 << .. << asn
然后他们通过使用后继函数来改进它

succ :: ([b] -> c) -> [a -> b] -> [a] -> c
succ = \n fs as -> n (fs << as)

其中数字为

zero = id
one = succ zero :: [a -> b] -> [a] -> [b]
two = succ one  :: [a -> b -> c] -> [a] -> [b] -> [c]

依旧......

最后依赖类型zipWith变为

zipWith :: ([a] -> b) -> a -> b
zipWith n f = n (repeat f)

其中n是数字

但是,我正在努力将相同的技术应用于咖喱和晃动。我无法通过分别添加或删除元素来了解如何操作变体大小元组来扩大或缩小大小。 Haskell不提供此类操作。例如,uncurry应具有以下类型 uncurry ::(a1 - &gt; a2 - &gt; .. - &gt; an - &gt; b) - &gt; (a1,a2,..,an) - &gt; B'/ P>

我们如何在Haskell中将curry和uncurry作为依赖类型?

0 个答案:

没有答案