Ошибка, связанная с Показать экземпляр для функций - PullRequest
0 голосов
/ 16 апреля 2011

У меня есть следующий код, и я думаю, что что-то упустил:

bruteSolveWithStartAndEnd :: Node -> Node -> [Node] -> [(Float, [Node])] -> [(Float, [Node])]
bruteSolveWithStartAndEnd st en mp r
           | length mp - 1 == length (snd ( head r)) = sortBy (comparing fst) $ map (\x -> (fst x + (distanceBetweenTwoNodes en $ last $ snd x), snd x ++ [en])) r
           | otherwise = bruteSolveWithStartAndEnd st en mp $ nextStepsForMany r $ filter (/= en) mp

bruteSolve :: [Node] -> [(Float, [Node])] -> [(Float, [Node])]
bruteSolve mp [] = bruteSolve mp $ map (\l -> (0, [l])) mp
bruteSolve mp r
           | length mp == length(snd (head r)) = sortBy (comparing fst) $ r
           | otherwise = bruteSolve mp $ nextStepsForMany r mp

nextSteps :: (Float, [Node]) -> [Node] -> [(Float, [Node])]
nextSteps r n = map (\l -> ((fst r) + (distanceBetweenTwoNodes l $ last $ snd r), snd r ++ [l])) [ nn | nn <- n, nn `notElem` (snd r)]

nextStepsForMany :: [(Float, [Node])] -> [Node] -> [(Float, [Node])]
nextStepsForMany ar n = concat $ map (\l -> nextSteps l n) ar

Сам код работает.Но странно то, что хотя функции bruteSolve и bruteSolveWithStartAndEnd имеют один и тот же тип «результата», результат bruteSolveWithStartAndEnd не может быть напечатан в GHSi, а результат bruteSolve может:

*> bruteSolve [(Node 0 1), (Node 2 3), (Node 4 5)] []
[(5.656854,[Node {x = 0, y = 1},Node {x = 2, y = 3},Node {x = 4, y = 5}]),(5.656854,[Node {x = 4, y = 5},Node {x = 2, y = 3},Node {x = 0, y = 1}]),(8.485281,[Node {x = 0, y = 1},Node {x = 4, y = 5},Node {x = 2, y = 3}]),(8.485281,[Node {x = 2, y = 3},Node {x = 0, y = 1},Node {x = 4, y = 5}]),(8.485281,[Node {x = 2, y = 3},Node {x = 4, y = 5},Node {x = 0, y = 1}]),(8.485281,[Node {x = 4, y = 5},Node {x = 0, y = 1},Node {x = 2, y = 3}])] 


*> bruteSolveWithStartAndEnd (Node 0 0) (Node 5 5) [Node 0 0, Node 1 1, Node 2 2, Node 3 3, Node 4 4, Node 5 5]

<interactive>:1:1:
    No instance for (Show ([(Float, [Node])] -> [(Float, [Node])]))
      arising from a use of `print'
    Possible fix:
      add an instance declaration for
      (Show ([(Float, [Node])] -> [(Float, [Node])]))
    In a stmt of an interactive GHCi command: print it

Что я делаюнеправильно?Я что-то изменил (не помню что) и с тех пор эта ошибка появляется.Насколько я понимаю (первый день Haskell), функция печати проверит, выводит ли [..] Show и затем рекурсивно все внутренние элементы (в данном случае list-> tuple -> (Float & Node)) ...В любом случае, поскольку декларации «результата» одинаковы, почему эта разница?

Ура!

Ответы [ 2 ]

3 голосов
/ 16 апреля 2011

Нет экземпляра для (Show ([(Float, [Node])] -> [(Float, [Node])])), который говорит, что вы пытаетесь напечатать функцию.Это, вероятно, не то, что вы хотите сделать ... вы забыли аргумент bruteSolveWithStartAndEnd?

2 голосов
/ 16 апреля 2011

Вы не предоставили достаточно аргументов для bruteSolveWithStartAndEnd.Запрос типа

bruteSolveWithStartAndEnd (Node 0 0) (Node 5 5) [Node 0 0, Node 1 1, Node 2 2, Node 3 3, Node 4 4, Node 5 5] []

должен работать.

...