2014-12-16 8 views
3

저는 하스켈에서 초보자입니다. 마지막 인수하지 않고,부분적으로 적용된 재귀 함수

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 a 
    | n <= 0 = error "Invalid count." 
    | n == 1 = f a 
    | otherwise = f (frepeat (n-1) f a) 

: 나는 인수로 다른 함수를 여러 번 적용되는 기능을 썼다. 나는 그것을 원한다 - 부분적으로 적용된 함수 여야한다. 나는 이것을 시도했다 :

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

나는 기본을하는 것처럼 쓸 수있다 'n == 0 '인 경우는'id'를 반환 할 수 있습니다. 음, 완전히 솔직히 말하면, 재귀를 사용하지 않을 것이지만, foldr (.) id와 같은 것입니다. 복제하다 ' – chi

+0

@chi, 나는 당신의 대답을 이해하지 못했습니다. 당신의 사면의 완전한 규정을 보여줄 수 있습니까? –

+0

감사합니다. 그것은 작동합니다 : 'frepeat :: Int -> (a -> a) -> a -> a frepeat n f a \t | n == 0 = a \t | 그렇지 않으면 = foldr (\ _ acc -> f acc) a (replicate na)' –

답변

4

당신은 여분의 하나가 필요합니다 (.) 마지막 부분 일반적으로

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

,이

let f x = f (g x) 

let f = f . g 
+0

Ofcourse ... 감사합니다! –