2015-02-03 11 views
0

Итак, я очень новичок в Haskell, и я знаю, что в этом есть много информации, но я просто не понимаю. Если кто-то может помочь объяснить и показать мне, что я делаю неправильно, что было бы весьма признателен,Как найти список целых чисел в 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

Ваш вопрос немного разбросан и трудно следовать. Можете ли вы дать минимальный пример того, что именно вы хотите сделать с ожидаемым результатом и любыми ошибками компилятора, с которыми вы столкнулись? Кроме того, вы можете искать что-то в строках 'any (== 5) [1, 2, 3, 4, 5]', которое будет компилироваться, но 'if any (5 ==) Recipe' is not корректный синтаксис, поскольку 'if' должен иметь' then' и 'else', а' Recipe' - тип, а не значение. – bheklilr

+2

Кажется, что «правила» должны быть предикатами рецептов (т. Е. Типа 'Рецепт -> Bool'). Например, вы можете написать правило 2 (этот рецепт не имеет ни перца, ни лука) как '\ r -> not (pepper \' elem \ 'r && onion \' elem \ 'r)'. Это то, что вы ищите? Неясно, что делать «законным»; комментарий относится к объединению правил, но ваш код ничего не делает. – user2407038

+0

Извините, позвольте мне исправить свой вопрос, мне дал код мой учитель, и он должен быть сломанным кодом. Он компилируется и запускается, но не работает должным образом. Сейчас есть много комментариев «правил», эти правила должны, по сути, возвращать bool, например: «если трюфели, а затем точно трюфели», я пытаюсь выполнить поиск по каждому списку рецептов и посмотреть, соблюдает ли оно правило. If это имеет смысл .. – drocktapiff

ответ

2

Не работать с числами, но и использовать свой собственный тип данных, например,

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

Вы получаете ряд ингредиентов с использованием функций, таких как enumFromTo

Тогда вы можете написать что-то вроде

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

И вы можете проверить, если все правила применяются с использованием

legal receipt = all ($ receipt) ruleset 
Смежные вопросы