2009-05-18 4 views

답변

6

다음 코드는 일을 할 것입니다 :

map head [[1,2,3],[4,5,6]] 

map는 하스켈에서 가장 유용한 기능 (및 다른 기능 프로그래밍 언어) 중 하나입니다. 목록이 [a,b,c,d]이고 함수가 f이면 map f [a,b,c,d][f a, f b, f c, f d]을 반환합니다. head 함수는 목록의 첫 번째 요소를 추출합니다.

col :: Int -> [[a]] -> [a] 
col n = map (head . drop n) 

N보다 크거나 당신이 그것을 줄 목록의 길이와 동일한 경우이 실패합니다 유의 사항 : 일반적으로

map head [[1,2,3],[4,5,6]] -> 
[head [1,2,3], head [4,5,6]] -> 
[1,4] 
6

더는 이유입니다.

+5

동등하게,'col n = map (!! n)'은 의도를 조금 더 분명하게 전달한다고 생각한다. YMMV. – ephemient

1

다음 코드는 일을 할 것입니다 : 조나스 '답변을 확장하려면

map head [[1,2,3],[4,5,6]] 

; map은 목록의 각 요소에 함수를 적용합니다. 함수를 목록에 "맵핑"한 결과는 다른 유형의 새 목록입니다.

여기에 입력 된 목록의 유형은 [[Int]]입니다. 즉, 목록의 각 요소는 Int의 목록입니다. 따라서 각 하위 목록을 가져 와서 첫 번째 요소를 반환하는 함수가 필요합니다. 즉, head입니다.

map는 기능 head을 각 목록의 단지 선두 (최초의 요소)를 포함하는 유형 [Int]의 새 목록을 얻을 수 있도록 하위 목록의 각각에 적용됩니다, 요약합니다.

2

행렬을 행렬로 변환하는 라이브러리 함수는 Data.List.transpose입니다. 그래서 문제를 해결하는 하나의 방법이다

import Data.List (transpose) 
col = head . transpose 
또한 행렬에서 모든 열을 얻을 수있는 기능을 쓸 수

:

colN n matrix = transpose matrix !! n 

면책 조항 :

가 전치 당신이 필요로하는 경우 비용이 기억을 전체 행렬을 조 변경합니다. 첫 번째 열에 대해서는 사람들이 제시 한 다른 솔루션과 거의 동일한 비용이어야합니다.

또한 결과는 인수와 동일한 유형 인 [[a]] -> [[a]]이기 때문에 코드 변환이 비교적 위험합니다. 따라서 잘못된 수의 전치를 던지기 쉽습니다. (나는 이것을 어려운 방법으로 배웠다.)

관련 문제