我将赞扬我的另一个职位,但这一职位对于我自己来说足够大。
在这里,用一种“神灵”做这种事,但我觉得自己喜欢做些什么,因为它需要一种特定的取消功能(下文更是)。
首先,要界定一种重复数据类型
data RecT a = RecR a
| RecC (a -> RecT a)
因此,类型回收的变量要么只是一种总结结果(RecR),要么是持续入侵(RecC)。
现在,我们怎样做些什么,把它归入甲型六氯环己烷?
价值很容易:
valRecT x = RecR x
RecR x显然是甲型六氯环己烷。
什么职能需要一个论点,如id?
idRecT x = RecC $ x -> RecR x
回收中心总结一种功能,即有变数和回归类型。 表达
x -> RecR x
只是这种职能,因为正如我们在RecR x之前所观察到的那样,是甲型六氯环己烷。
更一般而言,任何单一担保功能都可以取消:
lift1RecT :: (a -> a) -> RecT a
lift1RecT fn = RecC $ a -> RecR $ fn a
我们可以通过反复总结雷杰内部更深层次的职能来概括:
lift2RecT :: (a -> a -> a) -> RecT a
lift2RecT fn = RecC $ -> RecC $ a -> RecR $ fn b a
lift3RecT :: (a -> a -> a -> a) -> RecT a
lift3RecT fn = RecC $ c -> RecC $ -> RecC $ a -> RecR $ fn c b a
因此,我们尽了一切努力,将一系列武断理由的职能变成一种单一类型,RecT a。 我们如何利用这一点?
我们可以轻松地勾划一个职能应用等级:
reduceRecT :: RecT a -> a -> RecT a
reduceRecT (RecC fn) = fn
reduceRecT _ = undefined
换言之,减少退税的理由是甲型六氯环己烷和乙型乙型乙型乙型乙型乙型乙型乙型乙型乙型乙型乙型乙型六氯环己烷,而后一种新丙型六氯环己烷则降为一级。
我们还可以在回收局内进行成品计算:
unrollRecT :: RecT a -> a
unrollRecT (RecR fn) = fn
unrollRecT _ = undefined
我们现在重新准备把论点清单应用于一项职能!
lApply :: [a] -> RecT a -> a
lApply [] fn = unrollRecT fn
lApply (l:ls) fn = lApply ls $ (reduceRecT fn) l
让我们首先考虑基点:如果我们用计算方法重新完成计算,我们只是不理会结果,回去。 在休养案件中,我们把论据清单减少一个,然后将 f改,把名单上的头盔应用到减少的脂肪中,导致新的累犯。
让我们努力:
lApply [2,5] $ lift2RecT (**)
> 32.0
因此,这种做法的利弊? 当然,“黑星号”版本可以采用部分清单;这里提出的“完整”型解决办法就是如此(尽管我们原则上可以用某些条条条条线确定)。 这种解决办法还不利于制定与其相关的远大体更细微的编码:我们需要为所有想要使用的国家制定国家清单。 最后,如果我们想支持混合变量类型的功能,那么将这种方式概括到类似的图式解决方案中,将是非常不容易的。
当然,另一个令人感兴趣的可能性是,通过利用Tmlate Haskell生成国家清单功能来提高准确性;这消除了某些碎块,但从某种意义上来说,可以购买两种执行方案的不利条件。