2014-12-28 5 views
0

Вот мой код:Haskell Ожидаемый тип: IO Char Фактический тип: String

mingle :: String -> String -> String 
    mingle (a:as) (b:bs) = ([a] ++ [b]) ++ mingle as bs 
    mingle [] [] = [] 
    main = putStrLn "Enter 1st String:" 
       >> getLine 
       >>= \a -> read a >> putStrLn "Enter 2nd String:" 
       >> getLine 
       >>= \b -> read b >>= mingle a b 

Ошибка:

MingleStrings.hs:10:45: 
    Couldn't match type ‘[]’ with ‘IO’ 
    Expected type: IO Char 
     Actual type: String 
    In the second argument of ‘(>>)’, namely ‘mingle a b’ 
    In the expression: read b >> mingle a b 

Я был под впечатлением, что читать будет в состоянии превратить тип IO к стандарт haskell type. Ни одна из других сообщений о работе с IO, казалось, не помогла.

ответ

3

read не возвращает IO типа, о чем свидетельствует его тип подписи:

λ> :t read 
read :: Read a => String -> a 

Что вы хотите сделать это:

main = putStrLn "Enter 1st String:" 
     >> getLine 
     >>= \a -> putStrLn "Enter 2nd String:" 
     >> getLine 
     >>= \b -> return $ mingle a b 

Поскольку mingle является чистой функцией, вы должны используйте return, чтобы ввести IO поверх этого. Также обратите внимание, что ваша функция mingle не обрабатывает все случаи. Поэтому вы можете это исправить.

+0

Итак, я прочитал, что основной тип IO или что-то в этом роде, и поэтому он должен вернуть что-то из IO? Мне дали, что длина строк будет одинаковой. – jchen114

+0

@ jchen114 Да 'main' должен возвращать что-то типа' IO'. – Sibi

Смежные вопросы