2012-12-07 3 views
1

목록에 짝수 만 포함되어 있는지 확인하는 기능이 필요합니다. 그렇다면 True을, 그렇지 않으면 False을 반환해야합니다.목록에 foldr이있는 짝수 만있는 경우 true를 반환합니다.

내가 사용하고자하는 기능은 없이 map/filter/foldr 일 가능성이 있습니다. 여기

내 시도 : 어느 .. 내가 청소기 방법이 있음을 확신

ListOfeven :: [Integral] -> Bool 
ListOfeven xs = 
    | foldr (+) True filter odd xs < 0 = True 
    | otherwise = False 

이 없다? :)

+0

당신이 제공 한 것을 사용하십시오. 우선 모든 경비원이 중복됩니다 – walpen

+1

그래서 실수로 마지막 코멘트에 입력하십시오 : 재 게시 - 당신이 준 일에서. 우선 모든 가드가 중복되고 합계가 0이 아닌지 확인하는 대신 필터 된 목록이 null이 아닌지 확인할 수도 있습니다. 또한 코드에 버그가 있으며 목록 [0]에 실패합니다. 그러므로'foldr (+)'와'<0'은 삭제되고 대신'not '에 넣어집니다. 없는 . 필터 홀수 '. 음, 널. filter' =='any' 그래서 이것은'not '가됩니다. 모두 이상한'. 그리고 그렇지 않습니다. 모든 foo' =='모두 (not. foo)'그리고'not. 홀수'=='짝수'라면, 우리는 프렐 리히 Raabe가 준'모든 평등 '이라는 대답으로 끝납니다. 희망 그게 :). – walpen

답변

7

는 가장 쉬운 단지 서곡에서 all 기능을 사용하는 것입니다 : 당신은 그냥 map, filterfoldr를 사용하여 주장하는 경우

evenList = all even 

을 :

evenList = foldr (&&) True . map even 
5
myfunc = foldr (\a b -> even a && b) True 
1

Frerich의 솔루션은 잘 작동하지만 터치만으로 최적화 할 수 있습니다.

evenList :: [Integer] -> Bool 
evenList = foldr ((&&) . even) True 

이것은 한 번만 목록을 통해 실행됩니다. 여기에 기능 조성물은 조금 이상하다, 그러나 그것의 유형을 검사에 더 명확하게 :

하나의 인수를 even의 결과는, 여기에 사용되는 && 연산자에 첫 번째 인수에 바인딩
(&&) . even :: Integral a => a -> Bool -> Bool 

접두사 표기법으로.

+2

벤치마킹 해 보셨습니까? 나는 foldr (&&)가 참이라고 믿는다. map even '은 스트림 융합 (stream fusion)으로 인해 목록을 한 번만 반복합니다. 그것이 무엇이며 어떻게 작동하는지 [this StackOverflow question] (http://stackoverflow.com/questions/578063/what-is-haskells-stream-fusion)을 참고하십시오. –

+2

굉장! 나는 좀 더 광범위한 숙제를해야한다고 생각합니다! 더 조사 할 것이다. – fredugolon

관련 문제