2014-04-29 1 views
1

하스켈을 배우기 시작했는데 목록에있는 요소를 어떻게 정의 된 공백 문자가있는 단일 연결된 문자열로 출력할까요? 나는 아래의 스크립트에서 이것을 달성했다.haskell의 mapM_에 대한 다중 인수를 가진 구문 분석 함수

그러나 필자는 분리 기호를 인수로 지정할 수 있도록 putStrSep 함수를 작성하려고합니다. 아래 예제에서 하드 코드 된 대신.

#/usr/bin/env runghc 
import System.Environment --for the getArgs function 

-- Concatenate my own string 
putStrSep :: String -> IO() 
putStrSep x = putStr (x ++ " ") 


--Prints the list of arguments 
main = do 
putStrLn "Usage: helloworld.hs your full name" 
args <- getArgs --returns you a list of string 
putStr "Your name is: " 
mapM_ putStrSp args 
putStrLn "\nGood bye!" 
+0

'putStrSep':: String -> [String] -> IO()'를'strSep :: String -> [String] -> String'으로 대체하는 것이 IO를 피하는 것이 좋습니다. 출력을 화면에서 직접 팝업하는 것 이외의 다른 작업을 수행 할 수있는 유연성. (명령 줄 인터페이스에서 GUI로 프로그램을 전환 할 때 감사하겠습니다. UI를 처리와 분리하십시오.)하지만 intercalate :: [a] - [[a]] -> [ a]''Data.List'에서'[String] = [Char]'와 같이 'main'에 직접 입력 할 수 있습니다 (http://stackoverflow.com/a/23355494/1598537). – AndrewC

답변

4

당신은 당신이

putStrSep :: Char -> String -> IO() 
putStrSep sep str = putStr (str ++ [sep]) 

주와 같은 putStrSep 구현할 수 있습니다 : 당신의 mapM_ ... 필요가 mapM_ (putStrSep '\t') args

같은 것을 대체 할 수 또는 당신은 (Data.List에서) intercalate을 사용할 수 있습니다, 그 교체 mapM_ ...

putStrLn $ intercalate " " args 

또는

putStrLn $ intercalate [sep] args 

sep는 구분 문자이다.

+1

'intersperse'은 문자열을 연결하지 않습니다. 대신에'intercalate '를 원한다. –

+0

@ ØrjanJohansen 간과 함. 고맙습니다. 답변이 업데이트되었습니다. 을 넣다 제안을 –

+0

덕분에, 그것은 가 나는 또한 mapM_와 'mapM_ putStrSep "\ t"args'을 제안 putStrSep 기능을 사용하여 시도했지만 – altimit

관련 문제