2012-03-08 4 views
0

새 메모리 유형을 선언하고 함수를 사용하여 메모리를 업데이트합니다. 프로그램을 컴파일하고 목록에 값을 추가 할 때 잘 작동하지만 내 목록이 비어 있으면 "함수의 비 한정적인 패턴 update"오류가 발생합니다. 당신이 나를 도울 수 있다면 내 코드는 다음과 같습니다.비어있는 패턴이 비어있는 목록 오류가 발생했습니다.

type Name = [Char] 
type Memory = [(Name,Integer)] 

update :: Name ->Integer -> Memory -> Memory 
update n x (h:t) 
    |(fst h==n) =(n,x):t 
    |((h:t) == []) = (n,x):[] 
    |(fst t==x) = h:(n,t) 
    |(t==[]) = h:(n,x):[] 
    |otherwise = h:update n x t 

답변

5

이것은 코드가 빈 목록의 경우를 다루지 않기 때문입니다. 특히 : h:t == []True으로 평가되지 않습니다. h:t은 비어 있지 않은 목록과 만 일치하는 패턴입니다. h을 목록의 머리글에 바인딩하고 t을 나머지 목록에 바인딩합니다.

그래서 함수가 삼가지 경우 처리해야 :

update n x [] = (n,x):[]      -- empty list 
update n x (h:t) | n == fst h = (n,x):t   -- key equal to n 
       | otherwise = h:update n x t -- key not equal to n 
+0

또한 제 2 체크 N에 추가 할 필요를 == FST의 시간 – apoellitsi

관련 문제