2013-05-07 2 views
0

안녕하세요, 하스켈을 처음 보았습니다.하스켈 목록 재귀 실수?

그래서 목록에서 500보다 큰 모든 정수를 제거하고 싶습니다.

import Data.List 

leng x = if(head x > 500) then leng(tail x) else [head x]++leng(tail x) 

나는 올바른 출력을 얻을 수 있지만, 각 출력의 끝에

예외입니다 : Prelude.head : 빈 목록

어떻게 그 문제를 해결하기 위해?

+0

, 사용한다 '(시간 : t)'대신 (그래서 여기에'(머리 X) :(LENG (꼬리 X))'[H] ++ t'')의. (:)은 하스켈의 죄수 함수로 하나의 항목을 목록의 앞에 추가합니다. – isturdy

답변

6
-- You need this to stop the recursion, otherwise it would try to split the list 
-- when there are no elements left. 
    leng [] = [] 

당신은 당신의 방법에 대한 정지 조건으로이 문제를 고려할 수 있습니다.

당신은 또한 다음과 같이 당신의 방법을 다시 작성할 수 : 하스켈에서리스트로 작업 할 때 첫 번째 문은 종종 reocurring됩니다

leng [] =[] 
leng (x:xs) | x > 500 = leng xs 
      | otherwise = x : leng xs 

. 예 : 일반적으로

last [x] = x 
-- the underscore means the value of the variable is not needed and can be ignored. 
last (_:xs) = last xs 
+0

'leng' 함수를 컴파일하려고하면 작동하지 않을 것입니다. – zurgl

4

추가 : 현재 leng x 이전

leng [] = [] 

.

는하지만 당신은 할 수 :

leng x = filter (<=500) x 

심지어

leng = filter (<=500) 
+0

도움 주셔서 감사합니다! – Valakor