我如何求和一个函数的参数[给定的函数签名,1024个Int参数...]

时间:2019-02-25 13:20:19

标签: haskell

我正试图弄清楚如何总结具有给定签名sum :: Int -> ... -> Int且具有1024个Int参数的函数的参数...

聪明的Currying / Recursion当然是我什至不知道如何开始的交易。

2 个答案:

答案 0 :(得分:8)

它为1024的事实可能是一个提示,您应该 以二的力量增强它。这是多达16个解决方案 您可以扩展。

它使用延续传递样式来让您拥有一个 函数消耗一些参数,然后另一个消耗更多参数。 要查看发生了什么,请尝试手动计算一个小示例, 说add4 id 1 2 3 4

add2 :: (Int -> a) -> Int -> Int -> a
add2 k x y = k (x + y)

add4 :: (Int -> a) -> Int -> Int -> Int -> Int -> a
add4 k = add2 (add2 (add2 k))

-- type signatures omitted from now on...
add8 k = add4 (add4 (add2 k))

add16 k = add8 (add8 (add2 k))

f = add16 id

现在您可以这样做:

>f 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
136

例如,我也可以编写更多无点的功能

add8 = add4 . add4 . add2

答案 1 :(得分:6)

{-# LANGUAGE FlexibleInstances #-}
class SumArgs a where sumArgs :: Int -> a
instance SumArgs Int where sumArgs = id
instance SumArgs a => SumArgs (Int -> a) where sumArgs m n = sumArgs (m+n)

sumFourExample :: Int -> Int -> Int -> Int -> Int
sumFourExample = sumArgs

在ghci中:

> sumFourExample 2 3 4 5
14