你能转换吗?
-- tupleUnfold :: forall a. ((forall b. a -> b)) -> a -> ((b))
tupleUnfold :: Int -> ExpQ
tupleUnfold n = do
xs <- forM [1 .. n] (const . newName $ "x")
y <- newName "y"
let y' = varE y
g (ps', es') x = (varP x : ps', appE (varE x) y' : es')
(ps, es) = foldl' g ([], []) xs
lamE [tupP ps, varP y] (tupE es)
Run Code Online (Sandbox Code Playgroud)
在保持清晰度的同时采用无点风格(我知道程序'pointfree',但更愿意不再混淆代码)?
无论哪种方式,可以做出哪些改变来改进功能的风格,或者使其意图更清晰?该功能旨在如下使用.
$(tupleUnfold 3) ((+ 1), …Run Code Online (Sandbox Code Playgroud) 是否有任何接近Haskell的全部或任何功能作为STL的一部分?如果没有,下面是一个很好的实现(我注意到如果迭代器是随机访问,sgi STL执行部分特化,虽然我没有打扰这个)?
template <typename InputIterator, typename Predicate>
inline bool all(InputIterator first, InputIterator last, Predicate pred) {
while (first != last) {
if (!pred(*first)) {
return false;
}
++first;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
类似地,如何最好地转换为迭代两个序列,并在BinaryPredicate为所有人返回true时返回true,否则返回false?我知道这是相对微不足道的,但似乎这应该由算法提供,我想确保我不会忽略某些东西.