我在哪里可以使用?

时间:2017-10-08 10:49:47

标签: haskell

好吧,我必须做这个函数,给定一个列表和一个数字,它返回列表中元素的位置(第一个位置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)

2 个答案:

答案 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)

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