这是一个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函数。
有人可以为我编写正确的代码吗?
非常感谢!!!!
答案 0 :(得分:3)
有人可以为我编写正确的代码吗?
没有。它看起来太像家庭作业了。
有人可以给我宝贵的提示,所以我可以自己做吗?
我很乐意尝试。
所以你有一个[Int] -> [Int]
类型的placeinorder函数。
你有getInt读取一个类型为IO Int
的Int。
显然,您仍然需要一个函数getIntList :: IO [Int]
。
一旦你有了这个功能,你就完成了。在main
函数中,您必须调用它并将结果粘贴到标准打印函数中(我们假装它具有类型print :: [Int] -> IO ()
- 实际上,它更通用)。
那么,你怎么写getIntList
?使用递归。
获取一个整数。如果它为零,您刚刚读了一个空列表。如果不是,请使用递归来读取列表的其余部分。然后把你读过的号码和你刚读过的列表的其余部分放在一起。
一旦你将上述内容翻译成Haskell,你就完成了。
答案 1 :(得分:0)
我自己得到了答案!
这是代码!
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
答案 2 :(得分:0)
也许我迷路了但是我没有看到convert_to_list与函数(:)的区别在于第一个arg为0的情况。由于你的特殊情况0回答convert_to_list的第一个参数永远不是0。用(:)
替换convert_to_list此外,如果这不是家庭作业(或者如果实现mergesort不是作业的一部分)haskell有一个排序函数(Data.List.sort)我不确定它使用什么样的排序(可能quicksort或mergesort)可以取代placeinorder。您还可以将placeinorder的类型签名更改为
placeinorder :: Ord a => [a] -> [a]
使它成为通用排序(这可能会使它稍慢)。
编辑:
此外,如果您保留读取功能,它会给您
* 异常:Prelude.read:无解析
如果您的用户为您提供了错误的数据(即不解析为Ints的字符串),我建议您更改getInt以返回IO(可能为Int)(并可能为错误的输入打印警告)。