2014-10-21 5 views
1

다음 함수는 map 및/또는 filter 만 사용할 수 있습니다. fold/foldr 등.이 함수는 다음과 같은 서명과 유형을 가져야합니다. apply::n f x 및 f에만 x를 사용하려면 n times이어야합니다. 조금 더 공식적으로 설명하면, 다음과 같이 보입니다 : apply n f x = f (f...(f x)...), 여기서 f는 n 번 적용됩니다.목록 대신 단일 요소 만 반환하는지도 및/또는 필터. HASKELL

이것은지도에서 매우 쉽게 얻을 수 있지만 문제는지도가 받아서 목록을 반환한다는 것입니다. 그리고 그것은 하나의 정수만 가져 와서 f로 변환 한 다음 그 새로운 정수를 반환하기를 원합니다.

내가 지금까지 쓴

:

apply::Int->(Int->Int)->[Int]->[Int] 
apply n f x 
| n==1   =map f x 
| n>1   =apply (n-1) f (map f x) 
| otherwise =x 

이것은 (목록을 복용하고 반환하여 작품) 어떻게 그것을 호출 오전 :

main = do 
print(apply 2 (*2) [3]) 

를 내가 일을이 기능을 수정하는 방법 더 이상 목록을 가져 오지 않고 반환하지만 단일 정수를 사용하고 새로운 수정 된 정수를 반환합니다. 감사합니다

+0

1.이지도 제거는; 이것은'Int' 타입을 만들 것입니다; 2.'apply'라고하는 줄에서'apply' 만'n' 번이라고 확인했습니다 -'f'는 전혀 호출되지 않습니다. 그러나'apply (n-1) ... '가'f''n-1' 번 적용 결과를 리턴한다면,'f''가'n' 번 적용될 수 있을까요? –

+1

당신은'map' /'filter' 만 사용할 수 있다고 말합니다. 왜'apply n f x | n == 1 = f x | n> 1 = 적용 (n-1) f (f x) | 그렇지 않으면 = x'? – genisage

답변

4

이 경우 map 또는 filter이 필요하지 않습니다. 목록 모나드의 영역에 들어가면 아무런 탈출구가 없습니다 (filtermap 만 사용할 수있는 경우). 여기에 공부할 수있는 매우 간단한 구현의 :

apply :: Int -> (a -> a) -> a -> a 
apply 0 _ = id 
apply 1 f = f 
apply n f = (apply (n - 1) f) . f 

Live demo

0
apply 0 _ x =      x 
apply 1 f x =      f x 
apply 2 f x = apply 1 (fmap f f)  x 
apply 3 f x = apply 1 (fmap f f) $ f x 
apply 4 f x = apply 2 (fmap f f)  x 
apply 5 f x = apply 2 (fmap f f) $ f x 

일반화 할 수 있는지 확인하십시오.

프로 팁 : F FORALL

  1. . x = apply 0 (fmap f f) xf x = apply 0 (fmap f f) $ f x
  2. f . g 경우 fmap f g = f . g, 잘 입력됩니다.

왜지도/필터가 필요한지 잘 모르겠습니다. 어쩌면 질문을 다시 말할까요?

관련 문제