Просто поместите эту строку, которую вы использовали в GHCi, в блок do
:
do
k <- listRead "file.txt"
let r = yourPureFunction k
return r
В do
запись , для строки x <- mx
, всякий раз, когда mx :: M <b>a</b>
для некоторой монады M
, у нас есть x :: <b>a</b>
.
Таким образом yourPureFunction :: <b>a</b> -> <b>b</b>
применяется к аргументу a
внутри из M
, и объединенное значение monadi c, представленное блоком do
, имеет тип M <b>b</b>
, поскольку return
имеет тип return :: <b>b</b> -> M <b>b</b>
, а общий тип do
block - это тип его последнего выражения.
Приведенный выше код действительно является синтаксическим представлением более высокого уровня / encodable как / (return . yourPureFunction) =<< listRead "file.txt"
, что также совпадает с yourPureFunction <$> listRead "file.txt"
(с (<$>) = fmap
), но это не главное.