2017-03-28 2 views
4

다른 목록의 차이점을 나열하는 함수를 만들려고합니다. 그래서 [1,3,7,11]는 [2,4,4]를 반환 할 것입니다. 목록 이해력을 사용하려고하지만 사용하려는 기능에 문제가 있습니다. [t]를 [int]로 변환하고 다시 [t]로 변환하여이 형식을 유지할 수 있습니까?다른 목록의 갭 목록 생성. 나를 다시 잡고있는 오류 유형

{ difflist x y = [ p - q | p<- [x..y], 

          q<- [ ([1..(length [x..y]) ] !! [x..y]): []]] } 



<interactive>:200:70: error: 
    • Couldn't match expected type ‘Int’ with actual type ‘[[Int]]’ 
    • In the second argument of ‘(!!)’, namely ‘[x .. y]’ 
     In the first argument of ‘(:)’, namely 
     ‘([1 .. (length [x .. y])] !! [x .. y])’ 
     In the expression: ([1 .. (length [x .. y])] !! [x .. y]) : [] 
+1

목록의 각 연속적인 쌍에 대한 차이점을 의미합니까? – Netwave

+0

어딘가에서 읽는 것을 기억합니다 (미안하지만 지금 소스를 찾을 수 없습니다). 'list' 처리를 위해,'length'와'!!'를 사용하면 아마도 잘못했을 것입니다. – wizzup

+0

@FrankSimon 아니요 - 빈 목록을 테스트 케이스로 사용해보십시오! – epsilonhalbe

답변

9

방법에 대한 zipWith :

Prelude> let diffList = \x -> zipWith (flip (-)) x (tail x) 
Prelude> diffList [1,3,7,11] 
[2,4,4] 

편집 (때문에 아래의 의견에) :

다음과 같이 더 구체적인 함수 선언이있을 수 : 같아요

diffList :: Num a => [a] -> [a] 
diffList [] = [] 
diffList [email protected](_:xs) = zipWith (-) xs l 
+0

나는 약간의 복잡성을 숨기고 있지만이 솔루션이 정말 마음에 든다. 빈리스트에서는 더 자주 쓰이는 difflist x = zipWith (-) x (tail x) 게으름으로 인해) 작동합니다! – epsilonhalbe

+0

@epsilonhalbe, 플립은 정렬 된 목록 때문입니다. 그렇지 않으면 결과는 음수가되지만 지점도 있습니다. 감사합니다 – Netwave

+0

이것은 멋지지만 플립과 꼬리가 필요하지 않습니다. 'diffs (x : xs) = zipWith (-) xs (x : xs)'이면 충분합니다. – Redu

2

를 @ Daniel Sanchez의 zipWith 아이디어는 완벽합니다.

diffs :: Num a => [a] -> [a] 
diffs []  = [] 
diffs (x:xs) = zipWith (-) xs (x:xs) 

그러나 내가 mapAccumL 또 다른 좋은 방법이 생각처럼 그냥 할 수 있습니다. 우리는 다음과 같이 구현할 수 있습니다.

diffs :: Num a => [a] -> [a] 

diffs [] = [] 
diffs = tail.snd.mapAccumL (\a x -> (x,x-a)) 0