Haskell生成相同元素无限列表的方法及错误代码排查
在Haskell中生成相同元素的无限列表并处理用户输入
首先,咱们先聊聊你写的代码里的问题:
repeat :: a -> [a]
repeat x = xs where xs=x*xs
这里的*运算符用错啦!在Haskell里,*是用来做数值乘法的,而要构造列表,咱们得用cons运算符:——它的作用是把单个元素放到列表的最前面,这才是构建递归列表的正确方式。
正确的无限重复元素列表实现
Haskell标准库本身就自带repeat函数,它的实现逻辑非常直观,就是递归地把目标元素拼接到列表头部:
repeat :: a -> [a] repeat x = x : repeat x
如果你想用你尝试的where绑定写法,只要把错误的*换成:就行:
repeat :: a -> [a] repeat x = xs where xs = x : xs
这样就能生成一个由x无限重复的列表了,比如repeat 7会得到[7,7,7,...]——因为Haskell是惰性求值,它不会一下子生成全部元素,只会在你需要的时候计算对应部分。
接收用户输入并生成对应无限列表
接下来咱们实现接收用户输入的数字,然后生成该数字的无限列表。因为无限列表没法直接全部打印,所以咱们可以取前N个元素来展示(比如前10个)。
完整代码如下:
import Text.Read (readMaybe) -- 自定义的repeat函数(其实直接用标准库的repeat也完全可以) myRepeat :: a -> [a] myRepeat x = x : myRepeat x main :: IO () main = do putStrLn "请输入一个数字:" input <- getLine case readMaybe input of Just num -> do putStrLn "生成的无限列表的前10个元素是:" print $ take 10 $ myRepeat num Nothing -> putStrLn "输入不是有效的数字,请重新尝试!"
这里用readMaybe来安全转换输入字符串,避免输入非数字内容时程序崩溃。如果输入有效,就取出无限列表的前10个元素打印;如果无效,就给出错误提示。
比如你输入5,程序会输出[5,5,5,5,5,5,5,5,5,5]。
内容的提问来源于stack exchange,提问作者AMINA ARSHAD
相关产品推荐
相关产品推荐

