2012-05-13 2 views
2
concatr ::Integer -> [[Integer]] -> [[Integer]] 
concatr x (y) = [x] : y 
concatr x (y:ys) = concatr x y: concatr x ys 

저는 머리가 다 치기 시작한 수많은 조합을 시도했습니다. 정확히 내가 뭘 잘못하고 있니? 난 그냥 전달 된 목록의 모든 하위 목록에 넣어 정수를 원한다.목록에있는 모든 하위 목록의 시작 부분에 요소를 추가하십시오.

+0

게시 된 "솔루션"의 경우 첫 번째 패턴은 항상 ('concatr x (y) == concatr x y')와 일치하므로 항상 [[x], rest 또는 original list]'와 같습니다. 두 번째 경우에서 시도한 것처럼 ('concatr x y' 대신'(x : y)'를 사용하지 못했을 때) 원래의 목록을 분해해야하며, 널 (null) 경우'concatr x [] '로 끝나야합니다. –

+0

죄송합니다, 질문에 제안 된 코드를 언급 할 때 "게시 된 솔루션"이라고 말했습니다. 그것은 아마 혼란 스럽습니다. –

답변

8

map 함수를 사용할 수 있습니다. 에타는 간결한 해결책을 줄일

concatr :: Integer -> [[Integer]] -> [[Integer]] 
concatr x ys = map (x:) ys 

:

concatr x = map (x:) 
+1

나는 조금 더 자유주의 답을 만들었다. – pmr

+0

감사. 독특한 솔루션이있는 것처럼 들리는 것은 아닙니다. – rotskoff

+5

'concatr = map'으로 바로 갈 수 있습니다. (point-less?) 스타일의 함수에 대해 (:)'를 사용합니다. – ScottWest

0

당신이 map 피하려면 :

concatr :: Integer -> [[Integer]] -> [[Integer]] 
concatr x []  = [] 
concatr x (y:ys) = (x:y):concatr x ys 

2 예 : 목록이 비어 있으면

  • 을, 우리는 빈 목록을 반환합니다.
  • 목록이 y:ys 인 경우 새 머리글은 x:y이고 나머지 부분은 재귀 호출 concatr입니다.

예 : concatr 1 [[0],[2]][[1,0],[1,2]입니다.

관련 문제