0

ここに Haskell の質問があります: ユーザーが 0 を入力するまで数値を繰り返し入力し、これらの数値を順番に表示します。

int のリストを順番に配置する方法を知っています。これは私のコードです:

placeinorder :: [Int] -> [Int]
placeinorder [] = []
placeinorder [x] = [x]
placeinorder (pivot:xs) = placeinorder left ++ [pivot] ++ placeinorder right
                where left = filter (<pivot) xs
                      right = filter (>pivot) xs

さらに、入力から Int を取得する方法を知っています。

 getInt :: IO Int 
 getInt = do 
        line <- getLine
        return (read line :: Int)

しかし、入力数値をリストに変更する方法がわかりません...そして、placeinorder関数を使用できます。

誰かが私のために適切なコードを書くことができますか?

本当にありがとう!!!!

4

3 に答える 3

3

誰かが私のために適切なコードを書くことができますか?

いいえ、宿題のように見えます。

自分でできるように、誰かが貴重なヒントを教えてくれませんか?

喜んでやってみます。

したがって、 type の placeinorder 関数があります[Int] -> [Int]。タイプの単一の Int を読み取るには getInt がありますIO Int。もちろん、まだ function が必要ですgetIntList :: IO [Int]

その機能があれば、ほとんど完了です。main関数では、それを呼び出して、結果を標準の print 関数に貼り付ける必要があります (型があるふりをします-print :: [Int] -> IO ()実際には、より一般的です)。

それで、あなたはどのように書きgetIntListますか?再帰を使用します。

1 つの整数を取得します。ゼロの場合は、空のリストを読み取っただけです。そうでない場合は、再帰を使用してリストの残りを読み取ります。次に、読んだ番号と、今読んだリストの残りの部分を一緒にします。

上記を Haskell に翻訳したら、完了です。

于 2012-09-29T09:14:44.253 に答える
0

たぶん私は迷っていますが、convert_to_list が関数 (:) とどのように異なるのか、最初の引数が 0 の場合以外はわかりません。特殊なケースでは 0 の答えなので、convert_to_list の最初の引数は決して 0 ではありません。convert_to_list を(:)

また、これが宿題でない場合 (または、マージソートの実装が課題の一部でない場合)、haskell にはソート関数 (Data.List.sort) があります。使用するソートの種類がわかりません (おそらくクイックソートまたはマージソート)。 ) placeinorder を置き換えることができます。また、placeinorder のタイプ シグネチャを次のように変更することもできます。

placeinorder :: Ord a => [a] -> [a] 

一般的なソートにします(これにより、少し遅くなる可能性があります)。

編集:

また、読み取り機能をそのままにしておくと、

*例外: Prelude.read: 解析なし

ユーザーが不適切なデータ (つまり、Int に解析されない文字列) をフィードする場合、getInt を変更して IO (おそらく Int) を返すようにすることをお勧めします (そして、不適切な入力に対して警告を出力する可能性があります)。

于 2012-09-29T10:44:52.257 に答える
0

私は自分で答えを得ました!

これがコードです!

main = do 
      putStrLn "Please input numbers: "
      a <- getIntList
      print (placeinorder a)

getInt :: IO Int 
getInt = do 
        line <- getLine
        return (read line :: Int)

getIntList :: IO [Int]
getIntList = do 
           number <- getInt
           if number == 0 
                 then return []
                 else (do 
                          a <- getIntList
                          return (convert_to_list number a))

convert_to_list :: Int -> [Int] -> [Int]
convert_to_list 0 [] = []
convert_to_list x [] = [x]
convert_to_list x xs = x:xs


placeinorder :: [Int] -> [Int]
placeinorder [] = []
placeinorder [x] = [x]
placeinorder (pivot:xs) = placeinorder left ++ [pivot] ++ placeinorder right
                where left = filter (<pivot) xs
                      right = filter (>pivot) xs
于 2012-09-29T10:26:39.410 に答える