문제

기본적으로 내가해야 할 일은 유형 목록을 취하는 함수를 작성하는 것입니다. [(String, String)] 라인별로 출력이 다음과 같이 보이도록 내용을 인쇄합니다.

FirstString : SecondString

FirstString : SecondString

..ETC, 목록의 모든 항목에 대해. 나는 다음 코드를 가지고 있고 그것을 인쇄하지만 어떤 이유로 든 그것은 포함 된 줄을 인쇄합니다. [(),()] 결국.

display :: Table -> IO ()
display zs = do { 
    xs <- sequence [putStrLn ( a ++ " = " ++ b) | (a, b) <- zs];
    print xs 
}

내가 잘못하고있는 일이 있습니까?

도움이 되었습니까?

해결책

최종 인쇄 XS는 불필요합니다. 여기서 시퀀스는 () s (putstrln의 반환 값)를 반환하고 있으며, 인쇄물도 인쇄합니다.

인쇄 XS가 사라지는 동안 XS 변수 바인딩을 제거하고 시퀀스 _로 시퀀스를 만들어 리턴 값을 버릴 수 있습니다.

display :: Table -> IO()
display zs = sequence_ [putStrLn (a++" = "++b) | (a,b) <- zs]

다른 팁

당신은 심지어 사용할 수도 있습니다 mapM:

display :: Table -> IO ()
display = mapM_ (\(a,b) -> putStrLn (a++" = "++b))

나는 당신이 당신의 코드를 두 가지 함수로 나누어야한다는 JA에 동의합니다.

  • 순수한 부품 : 데이터 구조를 취하고 문자열로 바꾸는 함수
  • an 더러운 부분적으로, 그 문자열을 콘솔로 렌더링합니다

간단한 구현은 다음과 같습니다.

showTable :: Table -> String
showTable xs = concatMap format xs
  where
    format (a, b) = a ++ " : " ++ b ++ "\n"

display :: Table -> IO ()
display table = putStr (showTable table)

이 디자인에는 두 가지 장점이 있습니다.

우선, 대부분의 '논리'는 코드의 순수한 부분에 있으며 기능적 프로그래밍 방식으로 좋습니다.

둘째, 이것은 단순한 소프트웨어 엔지니어링 원칙입니다. 이제 코드의 다른 부분에서 데이터 구조를 형식화하려면 (가능성이 있음) 사용할 수있는 재사용 가능한 기능이 있습니다.

원하는대로 형식으로 튜플을 문자열로 가져 오는 함수를 작성하십시오.
그런 다음 목록 위에 기능하는 기능을 연결하십시오. 결과를 인쇄하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top