递归中的部分应用函数

时间:2014-12-16 10:02:09

标签: haskell ghci

我是Haskell的初学者。我写了一个函数,它将多次函数应用于参数:

frepeat :: (Integral n) => n -> (a -> a) -> a -> a
frepeat n f a
    | n <= 0 = error "Invalid count."
    | n == 1 = f a
    | otherwise = f (frepeat (n-1) f a)

有效:

ghci> frepeat 3 (^2) 2
256
ghci> frepeat 4 (++ "-bla") "bla"
"bla-bla-bla-bla-bla"

现在我想重写更紧凑,没有最后一个参数。我想 - 它必须是部分应用的功能。我试过这个:

frepeat :: (Integral n) => n -> (a -> a) -> a -> a
frepeat n f
    | n <= 0 = error "Invalid count."
    | n == 1 = f
    | otherwise = f (frepeat (n-1) f)

但GHCi不吃它......这是否意味着我无法做到?

1 个答案:

答案 0 :(得分:4)

你在最后一部分只需要一个额外的(。)

| otherwise = f . (frepeat (n-1) f)

一般来说,这个

let f x = f (g x)

可以改写为

let f = f . g