当我尝试使用下面的函数实现类似下面的函数时,编译器会返回“解析错误(可能是不正确的缩进或括号不匹配)”。
函数:
demo 8 [1,2,3] 应该返回 [1,2,3,1,2,3,1,2]
函数:
demo 8 [1,2,3] 应该返回 [1,2,3,1,2,3,1,2]
demo :: Int -> [a] -> [a]
let n = 0
demo arg [] = []
demo arg (x:xs) =
if arg <= length (x:xs) then
take arg (x:xs)
else
let (x:xs) = (x:xs) ++ (x:xs)!!n
arg = arg - 1
n = n + 1
demo arg (x:xs)
我该如何纠正这个问题呢? 谢谢!
let..in
块的缩进似乎不正确。尝试调整其缩进以使代码编译。 - Mark Seemannlet arg = arg - 1
和let n=n+1
是递归定义,将arg
和n
定义为无限循环计算。你不想要这样。你试图在 Haskell 中改变变量的值,但是它被设计成不可能做到这一点。这种方法对于函数式编程语言来说过于命令式而无法实现。大致上来说,“更改”变量的唯一方法是调用一个新值的函数。例如:f 0 = 0; f n = f (n-1)
定义了一个递归,它“减少”n
直到达到 0。 - chi