2012-01-02 2 views
3

나는 하스켈에서 초보자이며 모든 작은 글자를 대문자로 변환하고 나머지는 그대로 둡니다.소문자를 대문자로 변환

capitalise :: String -> String 
capitalise xs = [capitalise2 ch| ch<-xs] 

capitalise2 :: Char -> Char 
capitalise2 ch 
    | isLower ch = chr (ord ch - 32) 
    | otherwise = ch 

나는 점점 오전 오류 : 어떤 도움이 많이 주시면 감사하겠습니다

p3.hs:6:7: Not in scope: `isLower' 
p3.hs:6:23: Not in scope: `chr' 
p3.hs:6:28: Not in scope: `ord' 

나는 지금까지 나의 책에서이 문제를 해결했습니다.

+0

대문자/소문자를 만들 때 일부 문자가 실제로는 더 많거나 적은 문자가되기 때문에 이러한 종류의 전략은 특정 언어에서 작동하지 않습니다. – singpolyma

답변

16

첫째, 당신은에 대해 불평하는 기능을 사용할 수 import Data.Char해야합니다.

오른쪽, 새 기능에서 otherwise 사례가 누락되었습니다. if .. then .. else 구조로 시도하십시오. 숙련 된 Haskellers는 그 구조를별로 사용하지 않습니다. 아마 도우미 함수와 함께 할 것입니다 :

꽤 많이 당신이 이미 가지고있는, 가장 큰 차이점은 헬퍼 함수의 범위 인과 동일
capitalize cs = [ toUpper c | c <- cs ] 
    where 
    toUpper ... 

.

도 참조하십시오. Data.Char.toUpper.

이것은 또한 목록의 이해를 없애고 고차원 함수로 시작하는 좋은 기회 일 수 있습니다. 목록 이해 대신 map을 사용하여이 함수를 작성하십시오.

8

책에서 아직 표준 라이브러리를 설명 했습니까?

import Data.Char (toUpper) 

capitalise = map toUpper 
+0

죄송합니다. 감사. 이제 작동합니다! – Amjad

+7

@iPC 더 좋은'import Data.Char'. haskell98 모듈'Char'를 사용하고 있다면, 새로운 GHC에서'base' 모듈을 사용할 수 없습니다. –

3

isLower을 필터로 사용하는 대신 표현식의 일부로 사용해야합니다.

[if isLower ch then chr (ord ch - 32) else ch | ch <- xs] 

또는 내부에서 도우미 기능을 이동하십시오.

capitalise = map capitalise' 
      where capitalise' ch 
         | isLower ch = chr (ord ch - 32) 
         | otherwise = ch 
+0

감사! 그래서 나는 다른 기능을 사용할 필요가 없다고 생각하니? 또는 나는? – Amjad

+5

'chr','ord' 및'-32'를 사용하는 것이 올바른 방법이 아닙니다. 'toUpper'를 사용하십시오. – augustss

+1

@augustss : ASCII로 충분합니다. –

관련 문제