开始 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
我有以下内容:
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