Haskell输入列表 - 列表上的递归

时间:2014-03-05 11:22:10

标签: haskell

我希望用户给出列表的大小,然后在其他功能中使用该列表。像这样的东西

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)。 我该怎么做?

提前致谢

1 个答案:

答案 0 :(得分:1)

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

将所有内容放在一起,首先要getLine一个字符串,比如说s。接下来,您希望read将该字符串转换为Int,例如n。最后,您希望使用putStrLn在列表show上打印调用qsort (divv n)的结果。为了序列这些操作,您将需要bind monad中的IO操作,或者do符号(这些符号仅仅适用于monadic组合器,例如{ {1}})。这是一个示例实现。作为练习,请尝试将此实现转换为bind表示法:

do

请注意,您sortList :: IO () sortList = fmap read getLine >>= putStrLn . show . qsort . divv 的实施不正确。它应该显示为divv(为了按降序生成从divv n = [n,n-1..2]n的整数列表)。还要注意,可能有更好的方法来完成询问用户输入的任务,并返回将该输入应用于某个函数的结果。但在我看来,这是最简单的。