Как напечатать IO String - "Не удалось сопоставить тип 'IO String' с '[Char]' Ожидаемый тип: String Фактический тип: IO String" - PullRequest
0 голосов
/ 22 декабря 2019

Я хочу, чтобы эта функция печатала данный IO String

day :: IO String -> IO ()
day p2 = do
  putStr "p2: "
  putStrLn p2

Но компилятор говорит, что ему нужно [Char], но, насколько я знаю, он в основном такой же, как String, поэтому мойвопрос как распечатать IO String?

Также вот что выдает ошибка stack run:

    • Couldn't match type ‘IO String’ with ‘[Char]’
      Expected type: String
        Actual type: IO String
    • In the first argument of ‘putStrLn’, namely ‘p2’
      In a stmt of a 'do' block: putStrLn p2
      In the expression: do putStrLn p2    • Couldn't match type ‘IO String’ with ‘[Char]’
      Expected type: String
        Actual type: IO String
    • In the first argument of ‘putStrLn’, namely ‘p2’
      In a stmt of a 'do' block: putStrLn p2
      In the expression: do putStrLn p2
   |
17 |   putStrLn p2
   |            ^^

Я пытался сделать putStr ("p2: " ++ p2)и используя print, но безуспешно: (

1 Ответ

3 голосов
/ 22 декабря 2019

Сообщение об ошибке компилятора на самом деле очень ясно. Аргумент putStrLn должен быть String (или [Char], оба типа являются синонимами друг друга), но ваш p2 не String, а IO String.

Одна и та же фундаментальная ошибка возникает в обеих других вещах, которые, как вы сказали, вы пробовали - они не могут обойти эту проблему.

Не совсем ясно, что вы хотите сделать. Я вижу две возможности:

  • если вы просто хотите распечатать строку, то вы вообще не хотите, чтобы ввод был IO String, а просто String,Если вы просто соответственно измените сигнатуру типа, это скомпилируется без проблем.

  • возможно, вы действительно хотите предпринять действие типа IO String (например, getLine) каквход. В этом случае вы можете использовать нотацию do (которую вы уже используете в любом случае), чтобы связать вывод действия, которое является действительным String, с переменной и затем вызвать putStrLn с этим:

    day :: IO String -> IO ()
    day p2 = do
       putStr "p2: "
       s <- p2
       putStrLn s
    
...