我希望用户给出列表的大小,然后在其他功能中使用该列表。像这样的东西
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)。 我该怎么做?
提前致谢
答案 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
的整数列表)。还要注意,可能有更好的方法来完成询问用户输入的任务,并返回将该输入应用于某个函数的结果。但在我看来,这是最简单的。