2012-06-12 4 views
1

모든 요소 쌍 간의 차이가 -2에서 2까지의 간격인지 확인해야하는 프로그램이 필요합니다. (>= -2 && < 2). 그런 경우 True을 반품하고 그렇지 않으면 False을 반환하십시오. 예를 들어 [1,2,3]True이지만 [1,3,4]False입니다. all 기능을 사용하고 있습니다. 내 if 절에 무엇이 잘못 되었습니까?haskell 모든 함수

allfunc (x : xs) 
    = if all (...) xs 
     then allfunc xs 
     else [x] ++ allfunc xs 
allfunc _ 
    = [] 

아니면 완전히 잘못된 것을하고 있습니까?

+0

당신은이 있음을 유의를 연속을 사용하여 결합하고, 접어서 더 잘 쓸 수있는 것을 사용합니다. –

+0

주문 관련 있습니까? [-2,0]의 결과는 무엇입니까? – is7s

답변

3

이렇게하려면 목록 내포 또는 do-notation을 사용하는 것이 더 쉽습니다.

pairsOf lst = do 
    x <- lst 
    y <- lst 
    return (x, y) 

pairsOf 입력 lst의 숫자 쌍의 목록을 반환합니다. 예를 들어 pairsOf [1,2,3][(1,1),(1,2),(1,3),(2,1),(2,2),(2,3),(3,1),(3,2),(3,3)]이됩니다. 이제

, 당신은 한 줄 \(x, y) -> x - y에 한 쌍의 차이를 정의하고 목록을 통해 있음을 매핑 할 수 있습니다 : 이제

differences lst = map (\(x, y) -> x - y) (pairsOf lst) 

그냥 differences lst의 각 요소는 -2 사이에 있는지 확인해야 2.

물론 이것은 가능한 한 가지 방법 일뿐입니다. 다른 많은 방법들도 있습니다.

+1

아마도 다음과 같이 간단하게 할 수 있습니다 :'diffs lst = [(x - y) | 'x '는'checkDiffS = all (\ x-> x <2 && x> -2)' – user268396

-1

기본적으로 잘못된 것입니다. all은 테스트 할 값 목록과 술어를 가져옵니다. 따라서 주어진 술어 함수에 적용될 때 모든 값이 true가되는 경우에만 True을 리턴합니다. 예 :

allValuesEven = all even 
allValuesOdd = all odd 
+0

에 차이점의 결과 목록을 푸시한다. 첫 번째 문장이 틀렸다 :'[]'는 패턴'x : xs'. –

0

글쎄, 문제 사양은 분명하지 않습니다.

당신 말 :

모든 요소 사이의 diffence가 -2에서 2까지 간격에

(> = -2 & & < 2)

뿐만 아니라 :

예를 들어 [1,2,3]은 참이지만 [1,3,4]는 거짓입니다.

[1,2,3]의 경우 어떻게 맞습니까?

당신이 -2 <= diff <= 2을 의미 가정, 나는이를 사용합니다 :

allfunc :: (Ord a, Num a) => [a] -> Bool 
allfunc theList = all (\x -> (x >= -2) && (x<2)) [x-y | x <- theList, y <- theList ] 

allfunc [1,2,3] -- => True 
allfunc [1,3,4] -- => False 
1

왜 단순히 ...

allfunc xs = (maximum xs - minimum xs) <= 2 

또는 당신이 정말로 모든 쌍을 조사하려는 경우, 당신이 사용할 수있는 모나드 :

import Control.Monad 
allfunc xs = all ((<=2).abs) $ liftM2 (-) xs xs 

liftA2Control.Applicative에서뿐만 아니라 할 것입니다. 당신이 무엇을 설명 할

2

순진 방법은 다음과 같습니다

allfunc xs = all (<=2) [abs(a-b) | a <- xs, b <- xs ] 

그러나,보다 효율적인 방법은리스트의 최소 및 최대 비교하는 것입니다 :

fastfunc [] = true 
fastfunc xs = maximum xs - minimum xs <= 2