开始 Haskell - 使用数据构造函数和 IO monad 组合函数

Beginning Haskell - composing function with data constructor and IO monad

我有以下内容:

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)

我想用 TaggedContent 构造函数组合 transformContent;也就是说,类似

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

但是,这不会编译。

我是 Haskell 的新手,正在尝试理解正确的语法。

你只需要一个额外的点:

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

Daniel Wagner 解释了如何执行最少的修改来编译代码。我将评论一些常见的替代方案。

代码如

return . g =<< someIOAction

通常也写成

fmap g someIOAction

g `fmap` someIOAction

或者,导入后 Control.Applicative

g <$> someIOAction

在您的具体情况下,您可以使用:

transformContent . TaggedContent (id, attrs) <$> readFile f