2015-10-17 2 views
0

Оно деталь A.` Я застрял на ошибку, которая дается, когда я проверить эту функцию:Haskell Ошибка: Нет экземпляра для (Num [[a0]], вытекающее из использования `

maxWeight n wc f = 
let ps (x:xs) = case x of 
    [] -> [[]] 
    otherwise -> ps xs ++ map (x:) (ps xs) 
in maximum $ filter (<wc) $ map sum $ ps $ map f [1..n] 

Это полная ошибка:

No instance for (Num [[a0]]) arising from a use of `it` 
In a statement of an interactive GHCi command: print it 

Я тестирую функцию, вызвав его в GHCi с

maxWeight 5 10 (\i -> i + 1) 

ответ

1

мне трудно понять, что ваша функция (и помощник ps) предполагается сделать (обычно это помогает получить лучшие ответы ... :-), но это выглядит, как вы путаете две идиомы в вашем определении ps

Вы можете написать

ps y = case y of 
    [] -> [[]] 
    (x:xs) -> ps xs ++ map (x:) (ps xs) 

или просто

ps [] = [[]] 
ps (x:xs) = ps xs ++ map (x:) (ps xs) 

но, как она стоит сейчас, определение ps отсутствует базовый вариант (что ps []?)

С этим в сторону компиляции определение и maxWeight 5 10 (\i -> i + 1) дает 9

+0

О, я вижу, я предположил, что соответствие первого элемента пустым списком совпадает с совпадением всего ввода, являющегося пустым списком – user2452478

+0

Пустой list не имеет первого элемента, но '[[]]' * does * имеет пустой список как первый элемент. Поэтому для компилятора ваш 'ps' работает в списках списков и, следовательно, возвращает списки списков списков. Когда вы их суммируете, вы обрабатываете списки списков, как если бы они были номерами, которые (на обычном английском языке), что говорит ошибка messeage. –

Смежные вопросы