【问题标题】:Haskell input list - recursive on listHaskell 输入列表 - 在列表上递归
【发布时间】:2014-03-05 11:22:10
【问题描述】:

我希望用户给出列表的大小,然后在其他函数中使用该列表。类似的东西

divv x = [x..2]

qsort       :: [Int] -> [Int]    
qsort []     = []    
qsort (x:xs) =    
   qsort smaller ++ [x] ++ qsort larger    
   where    
      smaller = [a | a <- xs, a <= x]    
      larger  = [b | b <- xs, b > x]  

当我在控制台 divv 10 中写入时,我会得到列表 [10..2]
当我写 qsort[1,2,8,5,3,9,0] 时,我会对列表进行排序。

我希望用户只提供一个数字,例如 100,然后调用 qsort (divv 100)。 我该怎么做?

提前致谢

【问题讨论】:

  • divv x = [x,(x-1)..2] 为 x == 10 生成 [10,9,8,...2]
  • 您需要定义一个新函数fun n = qsort (divv n)。那你就叫它,fun 100。你也可以写(\n -&gt; qsort (divv n)) 100(\n -&gt; (qsort . divv) n) 100(qsort . divv) 100

标签: haskell


【解决方案1】:

要从终端读取输入,您可以使用getLine :: IO String。但是,在将字符串传递给您的函数之前,您需要将其转换为整数类型(在本例中为Int)。您可以使用函数read :: Read a =&gt; String -&gt; a 执行此操作。要打印字符串,可以使用函数putStrLn :: String -&gt; IO ()。但是,在打印qsort (divv n) 之前,您需要将其结果转换为字符串。这是使用函数show :: Show a =&gt; a -&gt; String 完成的。

把所有东西放在一起,你首先要getLine一个字符串,比如s。接下来,您想将该字符串read 转换为Int,例如n。最后,您想使用putStrLn 打印列表qsort (divv n) 上调用show 的结果。为了这些动作进行排序,你需要IO monad 中的bind 操作,或者do 表示法(它只是对像bind 这样的一元组合子进行脱糖)。这是一个示例实现。作为练习,尝试将此实现转换为do 表示法:

sortList :: IO ()
sortList = fmap read getLine >>= putStrLn . show . qsort . divv

请注意,您对divv 的实现不正确。它应该读取divv n = [n,n-1..2](为了生成从n2的整数列表,按降序排列)。另请注意,可能有更好的方法来完成询问用户输入的任务,并将该输入应用到某个函数的结果返回。但在我看来,这是最简单的。

【讨论】:

    猜你喜欢
    • 2019-07-21
    • 1970-01-01
    • 2013-01-17
    • 2011-07-16
    • 2015-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多