2009-06-24 7 views
6

나는 Learn You a Haskell을 통해 읽고있어 내가 머리에서 목록의 요소를 이동하려고하는 지점에 도달했습니다. 나는 순진한 방법이라고 생각하는 것을 생각해 냈습니다. 누군가 경험있는 Haskell 프로그래머가 대신 할 수있는 것을 보여줄 수 있는지 궁금합니다.하스켈에서 목록의 요소를 이동하는 방법?

이 예제에서는 정수 목록을 가지고 있으며 인덱스 '3'이 될 요소 '4'를 목록의 머리글로 이동하려고합니다.

let nums = [1, 2, 3, 4, 5] 
(nums !! 3) : delete (nums !! 3) nums 

[4, 1, 2, 3, 5]를 반환합니다.

당신은 어떻게 생각하십니까?

+3

은 "삭제"의 일치 패턴을 사용하여

toHead n xs = x : pre ++ post where (pre, x:post) = splitAt n xs 

지정된 요소의 첫 번째 발생을 삭제, 그래서이있는 경우는 잘못된 요소를 제거 할 수 duplicates ... – sth

답변

15

나는 이런 식으로 할 것 :

move n as = head ts : (hs ++ tail ts) 
    where (hs, ts) = splitAt n as 

splitAt 그것은 분할 (여기 hsts)에 의해 생성 된 두 부분을 반환, 지정된 위치에서 목록을 분할합니다. 앞쪽으로 이동해야하는 요소는 이제 ts의 시작 부분에 있습니다. head tsts의 첫 번째 요소를 반환하고 tail ts은 모든 요소가 이지만은 첫 번째 요소를 반환합니다. 함수의 결과는 hstail ts과 연결되고 요소 앞에 head ts이 붙은 올바른 순서로 결합 된 것입니다.

+3

tohead n = let (xs, y : ys) = splitAt n in y : xs ++ ys – Stephan202

+0

sth : 코드를 이해해 주시겠습니까? – shahkalpesh

0

공동 발생률이란?
나는 며칠 전 똑같은 것을 읽고 있었다. 그것을 다시 보았다 & 다음과 같은 성격의 사람.

nums !! 3 : [x | x <- nums, (x == (num !! 3)) == False] 
+0

두 가지 문제점 : 첫째, 중복 요소가 제거됩니다. 두 번째 (문제가 덜), 등호 연산자는 (a == b) == False가 아니라 반대 (=)입니다. –

+0

좋은 캐치. 보시다시피, 저는 초보자입니다.수정 해 주셔서 고마워요. – shahkalpesh

11

목록 인덱싱을 거의 사용하지 않은 숙련 된 하스 켈러. 나는 반복 순회을 방지하기 위해 브레이크를 사용하십시오 (당신이 요소를 일치시킬 가정 '4'가 아닌 인덱스 '3') : 우리는 동일한 작업을 수행 할 수

Prelude Data.List> case break (== 4) [1, 2, 3, 4, 5] of (a,x:xs) -> x:a ++ xs; (a,xs) -> a ++ xs 
[4,1,2,3,5] 

:

case break (== 4) [1, 2, 3, 4, 5] of 
    (a,x:xs) -> x:a ++ xs 
    (a,xs) -> a ++ xs 

에서와 같이 'splitAt'를 통해 인덱싱 :

Prelude Data.List> case splitAt 3 [1, 2, 3, 4, 5] of (a,x:xs) -> x:a ++ xs; (a,xs) -> a ++ xs 
[4,1,2,3,5] 
+0

예, 색인 '3'이 아닌 요소 4에서 일치합니다. 혼란을 드려 죄송합니다 – afrosteve

3

또한

toHead n l = l !! n : take n l ++ drop (n+1) l 
있다

은 다소 어려울 수 있으며 splitAt을 사용하는 것보다 쉽습니다.

STH의 솔루션에
+0

이 splitAt 버전보다 느리지 않습니까? – yairchu

+0

옵티마이 저가 완료되면 명확하지 않습니다. ghc -O로 실행하고 알아보십시오! –

+0

2 명이이 목록을 통과합니까? – Daniel

8

작은 수정 : 대신 head N tail

+1

이것이 해결책을 이해하는 가장 쉬운 방법이라고 생각합니다. 패턴 매칭으로 멋진 터치! – Michael

관련 문제