我有以下内容:
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的新手,正在尝试理解正确的语法。
答案 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