2012-01-03 4 views
14

나는 입력 n에 기반하여 [1..n]의 모든 정수를 나열하는 haskell 프로그램을 가지고있다. 특정 조건을 조건으로 필터링하여 목록으로 표시하려고합니다. 필터 기능/조건은 어디에서 어떻게 사용할 수 있습니까?하스켈에서 필터 함수는 어떻게 사용합니까?

하스켈 문서에 따르면

filter :: (a -> Bool) -> [a] -> [a] 

필터 술어를 만족하는 요소들의 목록을 리턴하는 술어 및리스트인가; 즉,

filter p xs = [ x | x <- xs, p x] 

답변

21

사용할 수 있습니다. 나머지 거래는 목록에 대한 술어 기능을 설계하는 것입니다. xs 및 술어 함수 p라는 목록이 있다고 가정하면

필터 p xs입니다.

종종, 당신은 익명으로 정의 p 또는 람다 표현을 볼 수 있도록 같은 :

필터 (\ n -> N`mod` 2 == 0) XS.

필요하지 않으며 명명 된 기능을 정의하는 데 초보자로서 유용 할 수 있습니다.

ISEVEN N = N 'mod` 2 == 0

evenListNumbers XS = ISEVEN 필터의 XS

evenListNumbers [1,2,3,4]

이 어느 [2,4].

주어진 목록 필터에 대한 조건부 함수는 목록 요소를 사용하여 부울 값을 반환합니다. true 인 경우 요소는 유지되거나 결과 목록에 추가되고 false이면 false가 전달됩니다.

+0

감사합니다! 그것을 아주 분명히 설명했다. 나는 짝수와 홀수를 필터링하는 방법을 이해했지만 입력 n을 나눌 수있는 숫자를 필터링하는 것은 어떨까? isDivisible n = filter [1..n] div n과 같은 것? 그 문법은 무엇입니까?: S – Amjad

+0

'isDivisible n p = n \'mod \'p == 0' 줄을 따라 함수를 만들어야하고이를 술어로 사용하십시오. 이 함수는 n을 p로 나눈 나머지가 0이면 true를 반환하고 그렇지 않으면 false를 반환합니다. 인수는 원하는 순서와 약간 다른 순서로되어 있으므로, 지금은 정의에서 간단히 뒤집거나'flip'을 사용하는 것이 좋습니다. – Sarah

+0

오류 발생,이 술어를 정의 할 위치가 확실하지 않습니다. 나는 필터 오른쪽과 같은 줄에서 사용할 수 없다고 생각합니까? 나는 프로그램이 입력을 받고 모든 제수를 나열하기를 원한다. 나는 이것을 위해 술어가 어떻게 정의되어 있는지 알고 싶다. 감사. – Amjad

2

글쎄, 당신은 술어로 해당 조건을 변환 (함수가 Bool를 반환) 및 숫자를 필터링하는 데 사용합니다. 당신은 홀수 번호를 선택해야하는 경우

예를 들어, 당신은 꽤 많이, 그것을 가지고 filter odd [1..n]

+0

필터와 함께 사용할 조건자를 정의해야하며 필터에 첫 번째 인수로 전달되는 Int -> Bool 함수입니다. 내가 정확히 어떻게 할 수 있니? 그건 내 질문이다. 예 : 입력 한 정수의 모든 제수를 나열하려면 어떻게합니까? – Amjad

+0

예, 'Int -> Bool' 유형의 함수가 필요합니다. 입력 번호의 목록 제수가있는 두 번째 예는 이러한 방식으로 작동하지 않습니다. 하나의 숫자에서 divisors리스트를 얻으므로, 함수는'Int -> [Int]'타입을 가지게됩니다. 이것은'Int -> Bool'과 같지 않습니다. 이 경우,'map' 또는'concatMap'이 당신이 원하는 것일 수도 있습니다. –

관련 문제