2017-09-22 2 views
1

나는, 인덱스 [Int][[String]]에있는 지금은 인덱스에 해당하는 [String] 유지하려면 :인덱싱 [문자열]] 하스켈

[0,1,4]

[[a,a,a],[b,b,b],[c,c,c],[d,d,d],[e,e,e],[f,f,f]] 줄 것을 [[a,a,a],[b,b,b],[e,e,e]]

그래서 나는이 작업을 수행 할 수있는 방법을 [Int] -> [[String]] -> [[String]]

?

foo :: [Int] -> [[String]] -> [[String]] 
foo indices strings = map (strings !!) indices 

유형 : x는 [[문자열]]이며, y는 [지능]

+6

직접 시도해보십시오. 어떤 것이 작동하지 않는지 등을 설명하십시오. –

+0

나는 이것을 –

답변

5

아마도이 같은 뭔가를 찾고있다 어디가

map (!!) (x y)을 시도

또한 일반화 될 수있다.

foo :: [Int] -> [a] -> [a] 

우리는 목록이 필요하지 않기 때문에 f-lists.

이것은 대단히 효율적이지 않습니다. 지표가 증가하고 있다고 가정 할 수 있다면 크게 개선 될 수 있습니다.

2

목록 작성을 사용하는 것이이 작업에 대한 표현적인 방법이라고 생각합니다.

getStrings :: [Int] -> [[String]] -> [[String]] 
getStrings is css = [cs | (ix,cs) <- zip [0..] css, ix `elem` is] 

*Main> gs [0,1,4] [["a","a","a"],["b","b","b"],["c","c","c"],["d","d","d"],["e","e","e"],["f","f","f"]] 
[["a","a","a"],["b","b","b"],["e","e","e"]] 

@ Centril의 의견에 따르면, 내가 동의해야 할 것은 동일한 것의 모나드 버전입니다.

gs :: [Int] -> [[String]] -> [[String]] 
gs is css = zip [0..] css >>= \(ix,cs) -> guard (ix `elem` is) >> return cs 

*Main> gs [0,1,4] [["a","a","a"],["b","b","b"],["c","c","c"],["d","d","d"],["e","e","e"],["f","f","f"]] 
[["a","a","a"],["b","b","b"],["e","e","e"]] 
+0

에 추가했습니다. 목록 내포를 사용하는 것에 대해 논쟁 할 것입니다. 하스켈은 그것이 구성 적이 아니기 때문에 매우 관용적이지 않습니다. 대신'map, filter, fold, >> = '결합자를 사용하십시오. – Centril

+0

@ Centril 전적으로 동의합니다. 모나드 버전을 추가하겠습니다. – Redu

+1

@Centril 나는 구성 성을 극대화하는 것이 항상 신중하지 않다고 주장합니다. List comprehensions은 매우 직관적 인 경향이 있습니다. 때로는 파이썬의 이상이 하스켈보다 더 낫습니다 ... – leftaroundabout