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

时间:2015-01-17 19:51:20

标签: haskell function-composition

我有以下内容:

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的新手,正在尝试理解正确的语法。

2 个答案:

答案 0 :(得分:3)

你只需要一个额外的点:

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

答案 1 :(得分:1)

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

代码如

return . g =<< someIOAction

通常也写成

fmap g someIOAction

g `fmap` someIOAction

或导入Control.Applicative

g <$> someIOAction

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

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