2011-04-16 79 views
0

相關的我有以下的代碼,我覺得我失去了一些東西:錯誤,以顯示實例功能

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,然後遞歸地遍歷所有內部元素(在這種情況下,列表 - >元組 - >(浮點數&節點))...無論如何,因爲「結果」聲明是相同的,爲什麼這種差異?

乾杯!

回答

2

您無法提供足夠的參數給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] [] 

應該工作。

+0

我是個白癡......乾杯! – o1iver 2011-04-16 16:14:35

3

(Show ([(Float, [Node])] -> [(Float, [Node])]))沒有實例說你正在嘗試打印一個函數。這可能不是你想要做的...你忘記了一個參數到bruteSolveWithStartAndEnd

+0

我是個白癡......謝謝! – o1iver 2011-04-16 16:14:54