2016-11-22 9 views
0

하스켈 입문 :하스켈 | Chars와 Int를 문자열로 바꾸는 문제.

안녕하세요. 내가 뭘하려고 오전

변경합니다 (맵 ORD와) (이 경우 X mod 3 == 0) 뭔가를 충족 몇 가지 숫자를 문자열 걸릴 [지능]에에를 켭니다.

이후 변경되지 않은 숫자를 다시 char로 변경하고 숫자를 여전히 숫자로 변경하고 싶습니다.

*Main> fromStringToList "hihello" 
[104,105,104,101,108,108,111] 
*Main> changeB3 [104,105,104,101,108,108,111] 
"'h'210'h''e'216216222" 

내가 원하는 것은 :

내 문제입니다 .. 다시 문자열로이 결합

"h210he216216222" 

내가 쇼를 사용하여 얻을 수 매핑하는 방법을 알아내는 붙어 Char에서 '_'없이 작동합니다. 감사.

내 코드 :

import Data.Char 

fromStringToList :: String -> [Int] 
fromStringToList "" = [] 
fromStringToList myString = map ord myString 

{- 
    changeB3 
    PRE: True 
    POST: every Int that can be divided by 3 is multiplied by 2 and 
kept as int, otherwise transformed to char 

-} 
changeB3 :: [Int] -> String 
changeB3 [] = "" 
changeB3 (x:xs) 
      | x `mod ` 3 == 0 = show map (x * 2) ++ changeB3 xs 
      |otherwise = map chr x ++ changeB3 xs 

답변

2

내가 코드를 언급합니다.

fromStringToList :: String -> [Int] 
fromStringToList "" = [] 
fromStringToList myString = map ord myString 

두 번째 줄은 중복 : myString 어쨌든 map 반환 [], 비어있는 경우. 제거해야합니다.

changeB3 :: [Int] -> String 
changeB3 [] = "" 
changeB3 (x:xs) 
      | x `mod ` 3 == 0 = show map (x * 2) ++ changeB3 xs 
      |otherwise = map chr x ++ changeB3 xs 

여기에 혼란스러워 할 것 같습니다. 재귀 함수를 사용하지만 map을 사용하려고합니다. 여기에는 재귀 또는 map을 사용합니다. 둘 다 사용할 수는 없습니다.

map을 사용하려는 경우 먼저 Int을 처리하는 방법을 정의해야합니다.

changeB3Single :: Int -> String 
changeB3Single x | x `mod` 3 == 0 = ... 
       | otherwise  = ... 

그러면 전체 목록에 대해 map입니다. 첫 번째 시도는

changeB3 :: [Int] -> String 
changeB3 xs = map changeB3Single xs -- type error! 

이 될 수도 있지만 map 여기가 아니라 단일 문자열보다, 문자열의 목록을 반환하기 때문에이 작동하지 않습니다. 우리는 단지 그들을 연결해야합니다.

changeB3 xs = concat (map changeB3Single xs) 

사실, concat (map ...) 때문에 일반적으로는 도서관에서 자신의 기능을 가지고있는 것을 알 수있다 :

changeB3 xs = concatMap changeB3Single xs 

(하나는 그 pointfree을 만들 수 있습니다,하지만 필요에 없다 - 특히 초보자.)

+0

정말 고마워요! 네 ..지도와 혼동스러워졌고 재귀는 두 가지 이전 기능에서 그들을 결합하려고했습니다. 두 사람의 원리를 완전히 이해하지 못한 것에 도달했습니다 ... 큰 감사드립니다! 아주 잘 설명했다! –