2016-08-27 3 views
0

у меня есть это, который работает отлично:Добавление еще один шаг к «>> =»

forM_ [1..10] $ \x -> myFunc1 x 99 >>= putStrLn . show >> return() 

myFunc1 :: Int -> Int -> IO Bool 
myFunc1 ..... 

Я хочу сделать добавить дополнительную строку к выходу:

forM_ [1..10] $ \x -> myFunc1 x 99 >>= (++) "the result is: " >>= putStrLn . show >> return() 

Но это Безразлично» т компилировать. Я пробовал разные варианты, но до сих пор не добился успеха. Ваши предложения?

ответ

2

Вы можете создавать show с помощью функции конкатенации, как так:

forM_ [1..10] $ \x -> myFunc1 x 99 >>= putStrLn . ("the result is: " ++) . show >> return() 
8

Первое, что торчит является то, что выражение:

(++) "the result is: " 

не является IO-действие - это просто чистая функция String -> String и - это одна из причин, по которой вы не проверяете тип кода.

Чтобы превратить его в IO-действие вы можете составить его с return:

return . ((++) "the result is: ") 
    :: String -> IO String 

Теперь вы можете использовать его с >>=.

Однако, это не там, где реальная проблема ...

предварять «результат:» перед show вы должны вставить его в putStrLn вызова:

... >>= putStrLn . (++ "the result is: ") . show 

(Примечание что нет необходимости в >> return(), поскольку putStrLn уже возвращает()).

Честно говоря, это намного проще, используя делать-обозначения:

forM_ [1..10] $ \x -> do 
    s <- myFunc1 x 99 
    putStrLn $ "the result is: " ++ show s 
1

Заменить ++ с add

add x y = return (x ++ show (y)) 


forM_ [1..10] $ \x -> myFunc1 x 99 >>= add "the result is: " >>= putStrLn . show >> return() 

причине: Возвращаемый тип ++ не IO типа

+0

Пожалуйста, прочитайте решение перед тем, как его проголосовать. – pamu

+0

Ваш ответ может быть обоснованно опущен из-за его отсутствия объяснения и неуместности 'add'. –

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