【发布时间】:2017-10-29 17:31:27
【问题描述】:
做third of the 99-Haskell problems(我目前正在尝试学习该语言)我尝试将模式匹配和递归合并到我的函数中,现在看起来像这样:
myElementAt :: [a] -> Int -> a
myElementAt (x ++ xs) i =
if length (x ++ xs) == i && length xs == 1 then xs!!0
else myElementAt x i
这给了我Parse error in pattern: x ++ xs。问题:
- 为什么会出现解析错误?是不是因为 Haskell 不知道从哪里删减我的清单(这是我最好的猜测)?
- 如何重新构建我的函数以使其正常工作?算法思想是检查列表是否具有指定inde的长度;如果是,则返回最后一个元素;如果不删除列表末尾的一个元素,然后进行递归。
注意:我知道这是一个非常糟糕的算法,但我已经为自己设定了编写该函数的挑战,包括递归和模式匹配。我还尝试不使用 !! 运算符,但这对我来说很好,因为它唯一真正做的事情(或者如果它编译了应该做的事情)就是将一个元素列表转换为该元素。
【问题讨论】:
-
除了模式匹配问题,请注意您的算法非常效率低下:
length已经需要遍历整个列表。如果您随后对此进行递归,那么对于简单的查找,您最终会得到 O (n ²) 的复杂度!
标签: haskell pattern-matching parse-error