2017-09-21 1 views
0

집합의 원소의 수를 반환하는 haskell에 재귀 함수 크기를 씁니다. 라이브러리 기능 길이를 사용하지 마십시오.집합의 원소의 수를 반환하는 Haskell 재귀 함수 크기

size :: Set a -> Int 

이것은 내가 지금까지 한 것입니다. 그것이 옳은 것처럼 보입니까, 아니면 질문에서 묻고있는 것을 오해하고 있습니까? 빈리스트 [] 크기 0을 가지고 있다는 사실, 그래서 : 코드 게다가

size :: Set a -> Int 
size [] = 0     -- zero 
size (_:xs) = 1 + size xs

그러나 당신의 코드를 설명 할 수 있어야하는 것이 중요합니다 감사합니다

size :: Set a -> Int 
    size [] = 1 
    size (_:xs) = 1 + size xs 
+1

질문에서 'Set'의 정의가 누락되었습니다. 'set Set = []'로 선언되면 코드가 정확합니다. 비어있는 세트의 크기는 0이어야합니다 (연습으로 생각할 사항에 대한 몇 가지 제안 :이 함수를 꼬리 재귀 적으로 만들려면 어떻게해야할까요? 성능에 대해서는 좋은 아이디어일까요? ?이 기능을 접어서 표현할 수 있습니까?) –

+0

답장을 보내 주셔서 감사합니다. 예,'size'는'set a = [a]'와 같이 선언됩니다. 나는 너의 제안을 살펴볼 것이다. – carl123

답변

0

난 당신이 하나 개의 중요한 부분을 잊었다 생각합니다. 첫 번째 절은 다음과 같이 설명 할 수 있습니다.

"빈 목록의 크기는 0입니다."

한편 재귀 절과 같이 설명 될 수있다 :

비 빈리스트의 크기는 한 플러스 세트의 크기 뺀 요소 (머리)와 동일 .

여기에서 우리는 Set a[a]과 같다고 가정합니다. 그러나 이것은 중복 항목이있는 세트를 가질 수 있음을 의미합니다. 우리가 원한다면 고유 필터를 사용해야합니다. 우리는 그것을 위해 nub :: Eq a => [a] -> [a]를 사용하거나, 우리는 우리의 size 함수를 구현할 수 있습니다

size :: Set a -> Int 
size = size' [] 
    where size' _ [] = 0 
      size' l (x:xs) | elem x l = size' l xs 
         | otherwise = 1 + size' (x:l) xs 
0

한 가지 가능한 솔루션을 사용하여 고차원 적 기능 :

size :: Set a -> Int 
size = sum . fmap (const 1) 

SetFoldable의 인스턴스이기 때문에이 작동하고 Functor의 인스턴스로 만들 수 있습니다.

관련 문제