2013-06-10 3 views
1

저는 haskell을 배우기 시작했습니다. 간단 할 수도 있지만 해결할 수 없다는 점에서 도움이 필요합니다. 나는이 형식이 문자열을 변환 할 필요가문자열을 bigram 목록으로 변환

ABCDEFG 

:

A-B 
B-C 
C-D 
D-E 
E-F 
F-G 

는 친절하게도 누군가가 나에게 약간의 팁을 제공하는 것입니다

나는 문자열을 가지고? 감사합니다.

답변

6

은 간단하게 다음과 같이 Data.List에서 zip를 사용 쌍 [(Char, Char)]의 목록을 반환

let str = "ABCDEFG" 
in zip str $ tail str 

합니다.

그런 다음 귀하의 질문에 같은 출력 무언가에, 당신이 뭔가를 할 수 있습니다 : 다음

let str = "ABCDEFG" 
let pairs = zip str (drop 1 str) 

당신은을 통해 매핑 할 수 있습니다 :

main :: IO() 
main = do 
    let str  = "ABCDEFGH" 
     couples = zip str $ tail str 
    mapM_ (\(x,y) -> putStrLn $ x : '-' : y : "") couples 
+5

... : 당신이 putStr을 사용할 수 있습니다

formatPairs :: String -> String formatPairs str = unlines $ map (\(f, s) -> f:'-':s:[]) $ zip str (drop 1 str) 

또는

formatPairs :: String -> String formatPairs str = unlines $ zipWith (\f s -> f:'-':s:[]) str (tail str) 

당신이 필요로하는 경우

그것을 인쇄 : 하나의 함수로

let str = unlines stringList 

'zipWithM_ (\ xy -> putStrL n $ [x, '-', y]) str (tail str)'. –

+0

이것은 나에게 정말 이상한 코드이지만, 와우 :) 나는이 기능을 연구해야 할 것이다. 감사. – cao

4

당신은 zipdrop를 사용하여 연속적인 문자를 페어링 할 수 있습니다 문자 쌍 목록을 사용하여 문자열을 만듭니다.

map (\(f, s) -> f:'-':s:[]) pairs 

은 문자열 목록을 제공합니다.

댓글이 지적 하듯이

, 대신 zip, mapdrop 1 당신은 사용할 수 zipWithtail :

zipWith (\f s -> f:'-':s:[]) str (tail str) 
단일 라인에서이 작업을 수행 할 수 있습니다

:

let stringList = map (\(f, s) -> f:'-':s:[]) $ zip str (drop 1 str) 

당신이 필요로하는 경우 단일 출력 문자열 unlines 예. 될 수

putStr (formatPairs "ABCDEFG") 
+0

감사. 좋은 코드 조각. :) – cao