【发布时间】:2018-01-21 07:24:23
【问题描述】:
当我尝试使用下面的函数来实现类似下面的函数时,编译器返回
解析错误(可能是不正确的缩进或不匹配的括号)
功能:
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)
我该如何纠正? 问候!
【问题讨论】:
-
possibly incorrect indentation。let..in块看起来缩进不正确。尝试用它的缩进来编译代码。 -
let arg = arg-1和let n=n+1是递归定义,将arg和n定义为无限循环计算。你不想要那个。您正在尝试在 Haskell 中改变变量,而 Haskell 的设计目的是使这成为不可能。这种方法对于在 FP 语言中工作来说太重要了。粗略地说,“更改”变量的唯一方法是调用具有新值的函数,例如。f 0 = 0 ; f n = f (n-1)定义了一个递归,它“减少”n直到它达到 0。
标签: haskell