2016-08-18 2 views
0

저는 하스켈을 매우 신중하게 생각하며 목록을 뒤집어 쓰려고합니다. 동시에 그 목록에서 목록을 뒤집고 싶습니다. 그래서 예를 들면 :하스켈의 다른 목록에서 목록 반전하기

Prelude> rev [[3,4,5],[7,5,2]] 
[[2,5,7],[5,4,3]] 

나는 다음과 같은 코드가리스트 반전 것을 알고있다 : 나는 잠시 동안 고전을 면치 못하고있다

rev :: [[a]] -> [[a]] 
rev [[]] = [[]] 
rev [[x]] = [[x]] 
rev xs = last xs : reverse (init xs) 

을, 나는 코드를 일부 추가을 만들었습니다하지만 여전히 작동하지 않습니다 나는 붙어있다.

rev :: [[a]] -> [[a]] 
rev [[]] = [[]] 
rev [[x]] = [[x]] 
rev xs = last xs : reverse (init xs) 
rev [xs] = last [xs] : reverse (init [xs]) 

어떤 도움을 주셔서 감사합니다. 미리 감사드립니다.

+3

포인트없는, 이것은 단지'rev = reverse '입니다. map reverse' – Alec

+0

위대한! 고맙습니다. – ZCoder

+0

패턴 일치로'reverse'라고 쓰는 자연스러운 방법은 도우미 함수와 누적리스트를 사용하는 것입니다. 첫번째'rev ls = loop [] ls' 그리고 나서'loop acc [] = acc; 루프 acc (a : as) = ​​루프 (a : acc) ls' – Michael

답변

7

내부 목록과 외부 목록을 뒤 바꾸어야합니다. 내부 목록을 역순으로 바꾸려면 map을 사용하여 map reverse [[3,4,5],[7,5,2]] == [[5,4,3],[2,5,7]] 목록의 각 요소에 reverse을 적용 할 수 있습니다. 그런 다음 결과를 다시 반대로 reverse $ map reverse [[3,4,5],[7,5,2]] == [[2,5,7],[5,4,3]].

이렇게하는 기능은 reversemap reverse이므로 단지 rev = reverse . map reverse의 구성입니다.

먼저 내부 목록과 외부 목록을 뒤집지 만 순서는 중요하지 않으며 다른 방법으로 처리 할 수 ​​있습니다 : rev = map reverse . reverse.

+0

정말 잘됐다! 감사. – ZCoder

+0

내부 또는 외부 목록을 먼저 뒤집을 지 여부는 중요하지 않습니다. – Ingo

+0

@Ingo 정확합니다. 솔루션을 더 명확하게하고 생각 프로세스를 명확하게하기위한 편리한 방법이었습니다.)하지만 정밀도를 추가 할 것입니다. – villou24

1

가장 자연스러운 방법은 분명히 map reverse . reverse 또는 reverse . map reverse입니다. 그것은 명시 적으로 작업을 인터리브, 그러나 아마 가장 효율적 :

revrev :: [[a]] -> [[a]] 
revrev = foldl (\ acc xs -> reverse xs : acc) [] 

당신이 코드 골프를 재생하려면, 당신은

revrev=foldl(flip((:).reverse))[] 

로이 쓸 수 있지만 그렇게하지 않습니다.