作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我可以用SYB的gfoldl一次性对listify的结果进行映射吗?
例如考虑以下代码:
extractNums :: Expr -> [Int]
extractNums e = map numVal $ listify isNum e
where isNum :: Expr -> Bool
isNum (Num _) = True
isNum _ = False
numVal :: Expr -> Int
numVal (Num i) = i
numVal _ = error "Somehow filter did not work?"
我不喜欢在 numVal 函数中我必须考虑 Expr 类型的不同数据构造函数,而我只对 Num 构造函数感兴趣。我宁愿用下面的 vals 函数替换 isNum 和 numVals:
vals :: [Int] -> Expr -> [Int]
vals xs (Num x) = x : xs
vals xs _ = xs
这可以用 gfoldl 完成吗?怎么办?
最佳答案
函数 listify
定义为
-- | Get a list of all entities that meet a predicate
listify :: Typeable r => (r -> Bool) -> GenericQ [r]
listify p = everything (++) ([] `mkQ` (\x -> if p x then [x] else []))
类似于过滤器
。我们可以创建一个类似于 mapMaybe
的替代方案,它将您需要的 map
和 filter
合二为一:
import Data.Generics
import Data.Generics.Schemes
import Data.Maybe (maybeToList)
import Data.Typeable
listify' :: (Typeable t) => (t -> Maybe r) -> GenericQ [r]
listify' f = everything (++) ([] `mkQ` (maybeToList . f))
那么你的例子可以表示为
numVal :: Expr -> Maybe Int
numVal (Num i) = Just i
numVal _ = Nothing
test :: Expr -> [Int]
test = listify' numVal
关于haskell - SYB : can a map over the result of listify be rewritten with a gfoldl?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29298106/
我可以用SYB的gfoldl一次性对listify的结果进行映射吗? 例如考虑以下代码: extractNums :: Expr -> [Int] extractNums e = map numVal
我正在使用一个名为 listify 的 wordpress 主题。 WP Job Manager 是一个必需的插件。在我的网站上,我需要两种列表。一份针对雇主的列表 [employers listin
我是一名优秀的程序员,十分优秀!