2017-10-08 3 views
0

음, 목록과 숫자가 주어지면 숫자의 위치 (첫 번째 위치 0)에있는 목록의 요소를 반환해야합니다.어디서 사용할 수 있습니까?

기본적으로 해당 함수는 (!!)입니다. 내가 직면하는 문제는이 함수에 제한해야한다는 것입니다. 주어진 위치가 목록의 위치보다 크거나, 때를 사용하려고했지만 작동하지 않으면이 오류가 표시됩니다.

여기서 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

하스켈에서 where은 일련의 로컬 정의를 소개합니다. 모든 정의에 첨부하여 해당 정의에 국한된 변수를 정의 할 수 있습니다. 따라서 코드의 문제는 where을 사용하는 곳이 아니므로이를 사용하는 것입니다.

로컬 변수를 정의하려고하지 않고 패턴에 조건을 추가하려고합니다. 이를 위해 pattern | boolean-condition 구문을 사용하는 패턴 가드 (예 : localiza (a:as) b | b < length as = ...)를 사용합니다.

그렇긴하지만 실제로 이렇게하는 것은 좋지 않습니다. length은 O (n) 연산이므로 반복의 각 단계에서 길이를 확인하면 많은 시간이 낭비됩니다. 대신 목록이 비어있는 경우에만 해당 사례를 잡을 수 있습니다. 색인이 범위를 벗어난 경우에만 발생합니다.

0

하스켈 위키에서이 예제를 제공 할 것입니다.

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) 

이렇게하면 길이가 너무 자주 확인되지 않고 목록이 비어있을 때만 종료됩니다.

관련 문제