답변

3

makeList은 데이터 생성자가 아닌 일반 함수이므로 패턴 일치는 할 수 없습니다. ConsNil에 패턴 일치가 필요합니다. 목록이 makeList에 의해 반환되었다는 사실은 관련이 없습니다.

removeList :: Eq a => a -> List a -> List a 
removeList _ Nil = Nil 
removeList x (Cons y ys) | x == y = ys -- Don't recurse if you only want to remove the *first* occurrence. 
         | otherwise = Cons y (removeList x ys) 

List 유형으로 직접 작업 할 수 있습니다. 결과를 내장 목록으로 작성한 다음 다시 변환 할 필요가 없습니다.

형식 생성자 [] 및 데이터 생성자 (:)이 중위 위치가 아닌 접두사 위치에 사용되는 기본 제공 목록에 구현 된 것과 동일한 기능과 비교됩니다.

removeGeneric :: Eq a => (List a -> List a) -> a -> List a -> List a 
removeGeneric _ _ Nil = Nil 
removeGeneric f x (Cons y ys) | x == y = f y ys 
           | otherwise = Cons y (removeGeneric f x ys) 

removeFirst = removeGeneric (\y ys -> ys) 
removeAll = removeGeneric removeAll 

removeGeneric에 첫 번째 인수는 호출 기능은 다음과 같습니다가 모두 removeFirstremoveAll의 기초로 사용할 수 있도록

removeList' :: Eq a => a -> [] a -> [] a 
removeList' _ [] = [] 
removeList' x ((:) y ys) | x == y = ys 
         | otherwise = (:) y (removeList' x ys) 

그냥 재미를 위해,의이 코드를 일반화 할 수 목록에 처음으로 일치하는 것을 발견 할 때 첫 번째 어커런스를 제거하려면 tail에 해당하는 것을 호출하면됩니다. 모두를 삭제하려면 번 발생합니다.

+0

모든 항목을 제거하려면 어떻게해야합니까? 호기심을 묻는 것만으로도 –

+0

이됩니다.하지만 대답 해 주셔서 감사합니다. –

+0

죄송합니다 코드에서 언급 한 것을 참조하십시오. –

관련 문제