2013-11-24 3 views
2

이 내 작업입니다 : 이 기능을 쓰기 : 문자열에서 모든 숫자가 아닌 문자를 제거합니다하스켈 부정 기능

onlyDigits :: String -> String 

(예를 들어, onlyDigits "ac245d62" 은 "24562"입니다).

나는이 있습니다

onlyDigits :: String -> String 
onlyDigits a = [ (not)isAlpha b | b <- a ] 

하지만 난 내가 잘못 갔어요 곳이

사람이 볼 수 컴파일 할 수 없습니다? 당신은 두 개의 인수 isAlphab-not을 적용하고 있으며, 컴파일러가 불평 이유는 아마

(not) isAlpha b 

를 작성하여

+0

여기를보세요 : https://www.fpcomplete.com/school/starting-with-haskell/basics-of-haskell/function-application – Ingo

답변

4

. 지금이 작은 실수를 수정하고있는 경우

쓰기 :이 Bool의 목록을 작성하기

onlyDigits :: String -> String 
onlyDigits a = [ not (isAlpha b) | b <- a ] 

여전히 오류가 발생합니다!


당신이 아마 원하는 것은 :이 상태 not (isAlpha b)을 충족 ba의 모든 요소를 ​​취할 것

onlyDigits :: String -> String 
onlyDigits a = [ b | b <- a, not $ isAlpha b ] 

.

또한 filter 기능을 사용하고 점없는 기능 할 수 : 숫자 만 유지에

onlyDigits :: String -> String 
onlyDigits = filter isDigit 

:

onlyDigits :: String -> String 
onlyDigits = filter (not.isAlpha) 

또는 더 나은!

+0

대단히 감사합니다. – Rob

1

실제로 오류가 2 개 있습니다.

첫 번째 오류는 유형 오류이며 함수 응용 프로그램을 올바르게 사용하지 않아서 발생합니다.

그러나 두 번째는 원하지 않는 문자의 한 카테고리 만 필터링하면 원하는 기능을 수행하지 못하는 것입니다. 예를 들어 공백 문자도 필요하지 않습니다. 또는 그래픽 기호.

때로는 "내가 원하는 것 외에는 ... (긴 목록)"대신 "나는 이것을 원한다"라고 말하는 것이 더 나을 것입니다. 그래서 원하지 않는 속성 중 하나를 부정하는 것이 아니라 원하는 속성을 필터링하십시오.