haskell将输入数字放在有序列表中

时间:2012-09-29 09:02:20

标签: haskell io

这是一个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函数。

有人可以为我编写正确的代码吗?

非常感谢!!!!

3 个答案:

答案 0 :(得分:3)

  

有人可以为我编写正确的代码吗?

没有。它看起来太像家庭作业了。

  

有人可以给我宝贵的提示,所以我可以自己做吗?

我很乐意尝试。

所以你有一个[Int] -> [Int]类型的placeinorder函数。 你有getInt读取一个类型为IO Int的Int。 显然,您仍然需要一个函数getIntList :: IO [Int]

一旦你有了这个功能,你就完成了。在main函数中,您必须调用它并将结果粘贴到标准打印函数中(我们假装它具有类型print :: [Int] -> IO () - 实际上,它更通用)。

那么,你怎么写getIntList?使用递归。

获取一个整数。如果它为零,您刚刚读了一个空列表。如果不是,请使用递归来读取列表的其余部分。然后把你读过的号码和你刚读过的列表的其余部分放在一起。

一旦你将上述内容翻译成Haskell,你就完成了。

答案 1 :(得分: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

答案 2 :(得分:0)

也许我迷路了但是我没有看到convert_to_list与函数(:)的区别在于第一个arg为0的情况。由于你的特殊情况0回答convert_to_list的第一个参数永远不是0。用(:)

替换convert_to_list

此外,如果这不是家庭作业(或者如果实现mergesort不是作业的一部分)haskell有一个排序函数(Data.List.sort)我不确定它使用什么样的排序(可能quicksort或mergesort)可以取代placeinorder。您还可以将placeinorder的类型签名更改为

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

使它成为通用排序(这可能会使它稍慢)。

编辑:

此外,如果您保留读取功能,它会给您

* 异常:Prelude.read:无解析

如果您的用户为您提供了错误的数据(即不解析为Ints的字符串),我建议您更改getInt以返回IO(可能为Int)(并可能为错误的输入打印警告)。