我希望用户提供列表的大小,然后在其他功能中使用该列表。像这样
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)。我该怎么做?
提前致谢
要从终端读取输入,可以使用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
。最后,您想用来在list上putStrLn
打印调用结果。为了对这些动作进行排序,您将需要在monad中进行操作,或以其他符号(对于诸如之类的monadic组合符而言只是反义词)进行操作。这是一个示例实现。作为练习,请尝试将此实现转换为符号:show
qsort (divv n)
bind
IO
do
bind
do
sortList :: IO ()
sortList = fmap read getLine >>= putStrLn . show . qsort . divv
请注意,您对的实现divv
是不正确的。它应该读取divv n = [n,n-1..2]
(以便从降序生成从n
到的整数列表2
)。还要注意,可能有更好的方法来完成以下任务:向用户询问输入,并返回将输入应用于某些功能的结果。但是我认为这是最简单的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句