2011-01-25 7 views
0

일단 직접 스타일을 사용하면 foldr을 사용하고 list comprehensions를 사용하여 concatMap의 기능을 작성하십시오.Haskell에서 concatMap의 함수를 작성하십시오.

다음 함수는 내가 foldr에 의해 작성했지만, 그것은 몇 가지 문제가 있습니다. **

concatMap' :: (a -> [b]) -> [a] ->[b] 
    concatMap' f []=[] 
    concatMap' f (x:xs)==foldr (\x acc->acc : f x) [] xs 

답변

2

당신이 foldr을 사용하는 것으로 가정하고 있기 때문에, 당신은 concatMap'의 명시 적 재귀 정의를 작성하지 않습니다. 따라서 하나의 정의 만 필요합니다. foldr을 사용하려면 누산기에 포함될 내용을 생각하십시오. 반복간에 어떤 종류의 상태를 유지해야합니까? 해당 상태는 각 목록 요소에 대해 어떻게 업데이트됩니까? 반환되는 최종 가치는 무엇입니까? 직접 재귀를 이해할 수 있도록 직접 스타일로 코드를 작성한 다음 (이 코드는 사용자의 할당에 포함되어 있음) 먼저 foldr 정의와 일치 시키십시오 (해당 소스 코드는 Haskell 98에 있음). 사양을 찾거나 검색 할 수 있습니다).

opz, 그리고 [ a', b', c', d', .. ]는 결과가 concatMap f [a, b, c, d, ..]의 예상 결과처럼 보이게 할 어떤 값
0
foldr op z [ a', b', c', d', .. ] 
== a' `op` b' `op` c' `op` d' `op` .. `op` z 

?

관련 문제