Начало работы с Haskell — создание функции с конструктором данных и монадой ввода-вывода

У меня есть следующее:

import Data.List

data Content
  = TaggedContent (String, [String]) String
  | Null

processContent :: Content -> IO Content
processContent c@(TaggedContent (id, attrs) text) =
  case stripPrefix "include=" a of
       Just f     -> return . TaggedContent (id, attrs) =<< readFile f
       Nothing    -> return c
  where a = head(attrs)
processContent x = return x

transformContent :: Content -> Content
transformContent x = x -- (details of implementation not necessary)

Я хотел бы составить transformContent с помощью конструктора TaggedContent; то есть что-то вроде

       Just f     -> return . transformContent TaggedContent (id, attrs) =<< readFile f

Однако это не будет компилироваться.

Я новичок в Haskell и пытаюсь понять правильный синтаксис.


person cm007    schedule 17.01.2015    source источник


Ответы (2)


Вам просто нужна дополнительная точка:

return . transformContent . TaggedContent (id, attrs) =<< readFile f
person Daniel Wagner    schedule 17.01.2015

Даниэль Вагнер объяснил, как выполнить минимальную модификацию, чтобы ваш код скомпилировался. Я прокомментирую несколько распространенных альтернатив.

Код, например

return . g =<< someIOAction

часто также пишется как

fmap g someIOAction

or

g `fmap` someIOAction

или после импорта Control.Applicative

g <$> someIOAction

В вашем конкретном случае вы можете использовать:

transformContent . TaggedContent (id, attrs) <$> readFile f
person chi    schedule 17.01.2015