2015-02-03 2 views
0

좋아요. 저는 하스켈에 매우 익숙하며,이 정보에 대한 많은 정보를 알고 있지만 이해가되지 않습니다. 누군가가Haskell에서 정수 목록을 검색하는 방법

을 설명하고 내가 주시면 감사하겠습니다 그 잘못 뭘하는지 보여줘 도움이 될 수 있다면 여기에 코드의 일부입니다 : 여기

n = 8      -- number of ingredients (excluding cream) 

type Recipe = [Integer] -- some ingredients 

-- list all recipes with k of n ingredients 

choose :: Integer -> Integer -> [Recipe] 
choose n k 
    | k == 0 = [[]]  -- only recipe with no ingredients 

    | n == k = [[1..n]] -- only recipe with all ingredients 

    | otherwise = choose (n-1) k ++ map (++ [n])(reverse (choose (n-1) (k-1))) 

-- omlette legality (rules must hold conjunctively) 

legal r = head $ map (\rule -> False) ruleset 

ruleset = [rule0, rule1, rule2, rule3, rule4, rule5, rule6, rule7] 


-- Rule 0: If truffles, then precisely truffles. 
rule0 r = False 

-- Rule 1: Either truffles, garlic, cream, or precisely one meat. 
rule1 r = False 


-- Rule 2: Not both peppers and onions. 
rule2 r = False 

을하고

bacon  = elem 1 
peppers = elem 2 
ham  = elem 3 
mushrooms = elem 4 
sausage = elem 5 
onions = elem 6 
garlic = elem 7 
truffles = elem 8 
cream  = elem 9 

이제 성분이다 규칙을 변경하여 논평 된 요구 사항을 충족 시키며 성분 목록을 통해 본질적으로 검색합니다.

줄을 따라 시도했습니다.
r = if any (5==) Recipe 

하지만 분명히 작동하지 않습니다, 누군가가 내가 잘못

+8

를 사용하여 적용하는 경우

data Ingredient = Bacon | Peppers | Ham | Mushrooms | Sausage | Onions | Garlic | Truffles | Cream deriving (Eq, Ord, Bounded, Enum) 

그런 다음

rule2 receipt = not ((Peppers 'elem' receipt) && (Onions 'elem' receipt)) 

같은 것들을 쓸 수 enumFromTo

처럼 사용하는 기능에 의해 재료의 범위를 얻을 그리고 당신은 테스트 할 수 있습니다 귀하의 질문은 약간 흩어져서 따라 다니기가 어렵습니다. 예상되는 출력 및 발생한 모든 컴파일러 오류로 정확히 무엇을하고 싶은지에 대한 최소한의 예를 제공 할 수 있습니까? 또한,'any (== 5) [1, 2, 3, 4, 5]'의 라인을 따라 무언가를 찾고 있을지도 모르겠지만 컴파일하면 ('5 ==) Recipe'는 컴파일되지 않습니다. 'if'는'then'과'else'를 가져야하고'Recipe'는 값이 아닌 타입입니다. – bheklilr

+2

"규칙"은 조리법에 대한 술어 (즉, 'Recipe -> Bool'유형) 여야합니다. 예를 들어, 규칙 2 (이 요리법에는 고추와 양파가 둘 다 없습니다)를'\ r -> not (고추 \'elem \'r && onion \'elem \'r)'로 쓸 수 있습니다. 이게 너가 찾고있는거야? '합법적 인'것이 무엇을해야하는지는 불분명하다. 주석은 규칙의 결합을 참조하지만 코드는 정렬을 수행하지 않습니다. – user2407038

+0

죄송합니다. 제 질문을 수정하겠습니다. 선생님이 코드를 받았고 코드가 깨졌습니다. 컴파일되고 실행되지만 필요에 따라 작동하지 않습니다. 이제는 많은 주석이 달린 "규칙"이 있습니다.이 규칙은 본질적으로 bool을 반환해야합니다. 예를 들어, "트뤼플 인 경우 정확히 트뤼플 인 경우"각 레시피 목록을 검색하여 규칙을 준수하는지 확인하려고합니다. if 그게 말이 되네 .. – drocktapiff

답변

2

번호와 함께 작동하지만 자신의 데이터 형식을 사용하지 마십시오, 예를 들어, 뭘하는지에 정교한 수 모든 규칙이

legal receipt = all ($ receipt) ruleset 
관련 문제