2017-10-08 90 views
0

好吧,我不得不做这个功能,给定一个列表和一个数字,它返回列表的元素数量的位置(即第一位置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

如果'position'小于列表的长度,则返回位置处的元素,但是如果位置大于长度,函数应该返回什么? –

+2

你在这里想要的是一名警卫,而不是“哪里”。 –

+0

我该如何使用警卫?如果位置大于长度,则不应该可能 –

回答

3

在Haskell where引入了一组本地定义。它可以附加到任何定义来定义该定义的局部变量。因此,您的代码中的问题不在您使用where的位置,而是您使用它的地方。

你并没有试图定义局部变量,而是试图给你的模式添加一个条件。为此,您使用花样守卫,其语法为pattern | boolean-condition,即localiza (a:as) b | b < length as = ...

这就是说,这不是一个真正的好办法。 length是一个O(n)操作,因此检查迭代每一步的长度会浪费很多时间。相反,当列表变为空时,您可以查明情况,只有当索引超出范围时才会发生。

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) 

这不会经常检查长度,只会在列表变空时退出。

相关问题