2014-12-03 2 views
1

하스켈에서 몇 가지 기본 변형에 관한 질문이있었습니다. 기본적으로 Input.md라는 입력 파일이 있습니다. 여기에는 내 프로젝트 파일에서 읽혀지는 일부 축소 자 텍스트가 포함되어 있으며 텍스트에 대한 변형을 수행하는 몇 가지 함수를 작성하려고합니다. convertToHTML이라는 함수로 이러한 함수를 완료 한 후 파일을 올바른 형식의 .html 파일로 출력했습니다.Input.md 파일을 읽고 .html 파일을 출력하십시오. 하스켈

module Main 
(
convertToHTML, 
main 
) where 

import System.Environment (getArgs) 
import System.IO 
import Data.Char (toLower, toUpper) 

process :: String -> String 
process s = head $ lines s 


convertToHTML :: String -> String 
convertToHTML str = do 
    x <- str 
    if (x == '#') 
    then "<h1>" 
    else return x 
     --convertToHTML x = map toUpper x 

main = do 

    args <- getArgs      -- command line args 

    let (infile,outfile) = (\(x:y:ys)->(x,y)) args 

    putStrLn $ "Input file: " ++ infile 
    putStrLn $ "Output file: " ++ outfile 

    contents <- readFile infile 

    writeFile outfile $ convertToHTML contents 

그래서,

  1. 는 어떻게 입력 파일을 읽고,
  2. 가 어떻게 내 입력 파일을 한번 더 읽어 것입니다 HTML 태그에 #로 시작하는 라인을 변환 할 _word_ (밑줄 1)이 다른 HTML 태그로 바뀌는 단어를 변환하십시오.
  3. 임의의 문자를 HTML 문자열로 바꾸십시오.

Map, Filter, ZipWith와 같은 기능을 사용해 보았지만 텍스트를 반복하여 각 텍스트를 변환하는 방법을 알 수 없었습니다. 아무도 제안이 없으면 제발. 나는 이것을 2 일 동안 똑바로 작업 해 왔고 몇 주 동안 실패한 코드를 보여주고 실패한 코드를 보여 주었다.

답변

0

Map, Filter, ZipWith와 같은 기능을 사용해 보았지만 텍스트를 반복하여 각 텍스트를 변환하는 방법을 알 수 없었습니다.

이들은 적절한 요소 컬렉션에서 작동하기 때문입니다. 그리고 그들은 실제로 "반복"하지 않습니다. 적절한 데이터를 입력하기 만하면됩니다. 예를 들어 # 문제를 해결해 보겠습니다.

우리의 파일은 하나의 거대한 String이며, 줄을 잘게 쪼개는 것이 좋습니다. [String]. 우리를 위해 무엇을 할 수 있습니까? 나는 전혀 모른다. 그래서 단지 search Hoogle for String -> [String]에합시다.

아, 저기, lines 기능! 그 대응 물인 unlines도 유용 할 것입니다. 박았 파일 다시이 함수가 먼저 각 줄에 convertHeader 매핑, 라인에 파일을 변환 볼 수 있듯이

convertHeaders :: String -> String 
convertHeaders = unlines . map convertHeader . lines 
--    ^String ^[String]   ^[String] ^String 

및 :

convertHeader :: String -> String 
convertHeader [] = [] -- that prevents us from calling head on an empty line 
convertHeader x = if head x == '#' then "<h1>" ++ x ++ "</h1>" 
            else x 

등 : 이제 우리는 우리의 라인 래퍼를 쓸 수 있습니다 함께.

See it live on Ideone

이제 형식 패턴을 대체 할 words과 같은 일을보십시오. 보너스 운동으로 convertHeader을 변경하여 라인 앞에 #의 수를 계산하고 그에 따라 <h1>, <h2>, <h3> 등을 출력하십시오.

+0

아직 답장을 보내지 못했습니다. 하하,하지만 아래에 응답을 게시했습니다. – KimCheeFatChoyProgrammer

+0

안녕하세요, 단어 및 암호를 사용하여 단어 변환을 시작할 수 있는지 궁금합니다. 나는 시행 착오의 코드를 겪어 왔지만, 나는 내 코드 내에서 함수를 어디에 사용해야할지 모른다. 나는 convertHeader와 convertHeaders 포맷을 복제하려고 시도했고, 또한 가드를 시도했다.하지만 아무것도 나를 위해 일하고있다 – KimCheeFatChoyProgrammer

관련 문제