2017-10-08 223 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) 

這不會經常檢查長度,只會在列表變空時退出。