【问题标题】:haskell place input number in ordered listhaskell 将输入数字放在有序列表中
【发布时间】:2012-09-29 09:02:19
【问题描述】:

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

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

非常感谢!!!!

【问题讨论】:

  • n.b.您对placeinorder 的定义等同于placeinorder xs = sort (nub xs),其中sortnub 均在Data.List 中定义。

标签: haskell io


【解决方案1】:

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

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

谁能给我有价值的提示,让我自己做?

我很乐意尝试。

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

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

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

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

将以上内容翻译成 Haskell 后,就完成了。

【讨论】:

  • 你能告诉我哪里错了吗? getIntList :: IO [Int] getIntList = do number
  • 我看到你自己已经弄清楚了,但为了记录:你想要“return (number : a)”。
【解决方案2】:

我自己就有答案了!

这是代码!

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

【讨论】:

    【解决方案3】:

    也许我迷路了,但我看不出 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)(并可能打印错误输入的警告)。

    【讨论】:

      猜你喜欢
      • 2023-02-06
      • 2020-11-24
      • 2016-07-17
      • 2014-02-19
      • 1970-01-01
      • 1970-01-01
      • 2020-03-09
      • 2014-11-18
      • 2013-03-25
      相关资源
      最近更新 更多