我正试图弄清楚如何总结具有给定签名sum :: Int -> ... -> Int
且具有1024个Int参数的函数的参数...
聪明的Currying / Recursion当然是我什至不知道如何开始的交易。
答案 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