我有以下问题。我的目标是实现函数,返回CHAR的ñ次数
GHCi> nTimes 42 3
[42,42,42]
GHCi> nTimes 'z' 5
"zzzzz"
Run Code Online (Sandbox Code Playgroud)
我已经实现了这样的解决方案,但递归并没有结束
nTimes:: a -> Int -> [a]
nTimes a n = a : nTimes a (n-1)
Run Code Online (Sandbox Code Playgroud)
并且函数只是返回一个不可阻挡的数字Chars 提前致谢,
为了停止递归,您需要一个base case。不会再次进行递归调用的情况。nTimes但是,您没有基本情况。为什么会nTimes 'z' 0被特殊对待?根据您的程序,这与其他任何情况一样。它将预先a列出,并使用 进行递归调用nTimes a (-1)。
因此,您可以实现基本情况,例如使用guard:
nTimes:: a -> Int -> [a]
nTimes a n
| n <= 0 = []
| otherwise = a : nTimes a (n-1)Run Code Online (Sandbox Code Playgroud)
所以如果n小于或等于0,我们返回一个空列表。在otherwise情况 ( n > 0) 中,我们因此屈服a,然后以 递归nTimes a (n-1)。
如果我们对此进行测试,nTimes 'z' 5我们会得到:
Prelude> nTimes 'z' 5
"zzzzz"
Run Code Online (Sandbox Code Playgroud)
您在这里实现了该replicate :: Int -> a -> [a]函数的“翻转”版本,因此您可以简单地将其编写为nTimes = flip replicate.