2017-11-29 4 views
0

저는 초보자이며 하나의리스트에 얼마나 많은 요소가 있는지 보여주는 함수를 정의하고자합니다. 나는 이미 생성 :하스켈은 하나의 입력으로 카운터를 생성합니다.

elementsl n []  = n 
elementsl n (_:xs) = elementsl (n+1) xs 

을하지만 두 개의 입력을 제공해야합니다 0 및 목록을 표시합니다. 어떻게 목록을 단일 입력으로 제공 할 수 있으며 여전히 함수에 카운터가 있습니까?

답변

3

매우 간단하고, 새로운 함수를 정의하고, where 블록에서 '도우미'기능을 정의

elements ls = helper 0 ls --`helper' is your previous function, defined below: 
    where helper n []  = n 
      helper n (_:xs) = helper (1+n) xs 

이 다른 곳에서 사용되는 helper을 방지 할 수 있지만,이 방법으로 함수를 작성 할 수 있습니다 .

그러나, 당신은 완전히이 꼬리 재귀를 피할 수있는, 그냥 쓰기 :

elements []  = 0 
elements (_:xs) = 1 + elements xs 

을 따라서 두 개의 인수의 필요성을 피할 수 있습니다. 이 두 번째 스타일은 일반적으로 더 관용적 인 haskell로 간주됩니다.

+1

그러나 나는 마지막 문장으로 확신이 없습니다. 꼬리 재귀 버전 (적절한 엄격함 수정 또는 옵티마이 저가 수정하기를기도 함)은 일정한 공간 (제공된 숫자는 표준 유형 임)에서 실행되고 비 꼬리 재귀 재귀 버전은 선형 메모리를 사용합니다. 첫 번째 버전을 사용하겠습니다. – chi