2012-01-16 8 views
-2

次のスニペットコードでは、誰かがエラーを説明できますか?このコードでは、私は、ユーザからの入力をしながらBSTのINORDERトラバーサルを実装しようとしていコードスニペットのエラー

import System.IO 

loop :: Int -> [Int] -> IO [Int] 
loop 0 ls = return ls 
loop n ls = do newNumber <- readLn 
       loop (n-1) (newNumber:ls) 

data Tree a = EmptyTree | Node a (Tree a) (Tree a) deriving (Show,Read, Eq) 

singleton :: a -> Tree a 
singleton x = Node x EmptyTree EmptyTree 

treeInsert :: (Ord a) => a -> Tree a -> Tree a 
treeInsert x EmptyTree = singleton x 
treeInsert x (Node a left right) 
        | x==a = Node x left right 
        | x<a = Node a (treeInsert x left) right 
        | x>a = Node a left (treeInsert x right) 

inorder :: Tree a -> [a] 
inorder EmptyTree = [] 
inorder (Node a left right) = inorder left ++ [a] ++ inorder right 

main = do 
    putStrLn " Please enter the number" 
    number <- readLn :: IO Int 
    putStrLn $ "The num is:" ++ show number 
    xs <- loop number [] 
    let numtree = foldr treeInsert EmptyTree xs 
    print numtree 
    ys <- inorder numtree 
    print ys 

私が手にエラーがある:

Couldn't match expected type `IO t0' with actual type `[a0]' 
In the return type of a call of `inorder' 
In a stmt of a 'do' expression: ys <- inorder numtree 
In the expression: 
    do { putStrLn " Please enter the number"; 
     number <- readLn :: IO Int; 
     putStrLn $ "The num is:" ++ show number; 
     xs <- loop number []; 
     .... } 
+3

コンパイラでエラーが発生した場合は、エラーメッセージを質問に追加します。そうでない場合は、コードが何を期待しているのか、実際に何を期待するのかを説明してください。 – interjay

+1

同じ質問を(ほとんど)繰り返し聞かないでください。あなたは何を期待していますか? SOは、人間によって駆動される分散コンパイラではありません。誰かこの質問を閉じることができますか? – Andre

答えて

1

私はコードを見るいくつかの問題がある:

  1. あなたはどこにでも
  2. あなたはの内容をインデントしませんでしたloopあなたが定義していない機能やインポートを呼んでいます
  3. ys <- inorder numtreeと書くと、inorderIO somethingを返しますが、そうではありません。代わりにletを使用してください。
  4. doブロックの末尾に<-というassignemntが付きます。これは式で終わる必要があります。
+3

@ user1145428:コードが不完全で、何が間違っているか教えてくれない場合は、どうすれば答えると思いますか? – interjay

+1

よろしくお願いします。次回は質問全体を明確に投稿します –

関連する問題