我可以使用 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完成吗?如何?