好吧,我必须做这个函数,给定一个列表和一个数字,它返回列表中元素的位置(第一个位置0)
基本上是函数(!!)
。我面临的问题是我需要限制这个功能,如果给出的位置大于列表中的位置,我试图使用一个但是它不起作用,它显示了这个错误:
parse error on input `where'
我可以在这里使用where
吗?在哪种情况下我可以使用where
?
localiza:: [a]->Int->a
localiza [a] 0 = a
localiza (a:as) b = localiza (as) (b-1)
where b+1 <= length(a)
答案 0 :(得分:3)
在Haskell中where
引入了一组本地定义。它可以附加到任何定义,以定义该定义的本地变量。因此,代码中的问题不在于您使用where
的地方,而是您使用它时的问题。
您不是要尝试定义局部变量,而是尝试为模式添加条件。为此,您使用模式保护,其语法为pattern | boolean-condition
,即localiza (a:as) b | b < length as = ...
。
那就是说,这不是一个很好的方法。 length
是一个O(n)操作,因此在迭代的每一步检查长度会浪费很多时间。相反,你可以在列表变空时捕获这种情况,这只有在索引超出范围时才会发生。
答案 1 :(得分:0)
我将从Haskell wiki中提供此示例。
elementAt' (x:_) 1 = x
elementAt' [] _ = error "Index out of bounds"
elementAt' (_:xs) k
| k < 1 = error "Index out of bounds"
| otherwise = elementAt' xs (k - 1)
这不会经常检查长度,只会在列表变空时退出。