2013-10-04 3 views
2

나 :기본 하스켈 : 다시 INT

에 대한 목록의 목록을 검색하는 방법을 나는리스트의 목록 (int 치의)에 대한 통해 검색 할 수있는 방법을 찾고 있어요 제목에서 말했듯 특정 int. 이것은 더 큰 문제의 일부이지만이 컨텍스트에서 설명하기 쉽도록 단순화했습니다.

이 예제에서는 int 목록을 통해 내 번호 하나를 검색하려고합니다. 번호 하나를 찾은 횟수를 합산하기를 원합니다. 아래의 예에서 결과가 3. 여기

내가 지금까지 가지고 무엇을 할 것입니다 :

a = [1,2,3] 
b = [1,17,12] 
c= [201,16,1] 
d = [234,235,123] 

y =[a,b,c,d] 

getOne :: [[Int]]->Int 
getOne List' = total 
    where 
     checkNumber x = x==1 
      checkList = filter CheckNumber List' 
      total = sum checkList 

은 내가 확인할 수 없기 때문에 목록 1과 같다면 나는이 작업을 수행 할 수 있습니다 알고 있지만 목록 안의 목록을 확인하려면 어떻게해야합니까?

답변

1

, 당신은 같은 것을 시도 할 수 있습니다 :

Prelude> let y = [[1,1,2] , [4], [5,6,1]] 
Prelude> sum [length $ filter (==1) yl | yl <- y] 
3 

또는 Applicative 사용 :

Prelude> import Control.Applicative 
Prelude Control.Applicative> sum $ length <$> filter (==1) <$> y 
8

목록 목록을 평평하게 만들고 이것을 해결하는 방법을 이미 알고있는 문제로 축소하십시오. 근본적으로, 당신이 목록의 목록을 통과한다는 사실은 당신의 대답을 변화시키지 않는다 : 단지 당신의 구조에서 1의 수를 신경 써라.

hoogle을 사용하여 목록을 병합하는 기능을 찾을 수 있습니다. 그런 함수 유형을 입력하면 결과를 얻을 수 있습니다. 이것은 Haskell API를 배우는 데 매우 유용한 도구이므로, 이제는 그것을 사용하기 시작할 때가되었습니다.

재귀를 사용하여 직접 병합 기능을 구현하는 것도 좋은 방법 일 수 있습니다. 이렇게하면 getOne 함수를 직접 작성하는 방법에 대한 통찰력을 얻을 수 있습니다. 그것은 좋은 학습 운동입니다.

0

나는 최대화 문제를 세는 몇 가지 유사한 기능을 코딩했습니다. 프로젝트에서 어떻게 작동합니까? CONCAT 연 방법 목록을 평평하게하는 것이

a = [1,2,3] 
b = [1,17,12] 
c= [201,16,1] 
d = [234,235,123] 

y =[a,b,c,d] 
getOne :: [[Int]] -> Int 
getOne = length . filter (== 1) . concat 

참고 필터는 목록의 각 항목에 대한 FUNC을 평가하고 false를 돌려 그 중 하나를 삭제하고, 길이는 나머지 요소를 계산합니다.

+1

미세 대답을하지만, 이러한 기능의 아무도는'Data.List'이 필요하지 않습니다 - 그들은 모두 '서곡'에 있습니다. –

+0

고마워요. 편집되었습니다 ... – Aaron

0

왼쪽 접기 옵션입니다. 이것은보다 효율적입니다 (각 요소를 한 번 반복).

getOne :: [[Int]] -> Int 
getOne = foldl (\ b a -> if a == 1 then b+1 else b) 0 . concat 
평평하지 않고
+1

아직도이 기능이 작동하지 않습니다.'a'는'[Int]'타입입니다. 'Int'가 아닙니다. – jozefg

+0

오, 고마워요. 나는'concat'을 잊었다. 내가 편집 할게. – Aaron