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

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

不,它看起来太像家庭作业了。

有人可以给我有价值的提示,以便我自己做吗?

我很乐意尝试。

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

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

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

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

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

于 2012-09-29T09:14:44.253 回答
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 回答
0

也许我迷路了,但我看不出 convert_to_list 与函数 (:) 有何不同,除了第一个 arg 为 0 的情况。由于您的特殊情况,0 回答 convert_to_list 的第一个参数永远不会为 0。将 convert_to_list 替换为(:)

此外,如果这不是家庭作业(或者如果实现合并排序不是任务的一部分)haskell 有一个排序功能(Data.List.sort)我不确定它使用什么样的排序(可能是快速排序或合并排序) 可以替换placeinorder。您也可以将 placeinorder 的类型签名更改为

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

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

编辑:

此外,如果您像现在一样离开读取功能,它会给您

*例外:Prelude.read:没有解析

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

于 2012-09-29T10:44:52.257 回答