FC++库提供了一种在C ++中支持函数式编程概念的有趣方法。
FAQ的简短示例:
take (5, map (odd, enumFrom(1)))
FC ++似乎从Haskell那里获得了很多灵感,从而重用了Haskell前奏中的许多函数名称。
我已经看到了最近的article关于它的问题,并且在stackoverflow的一些答案中已经简要地提到了它,但我无法在野外找到它的任何用法。
是否有任何开源项目积极使用FC ++?或者过去使用它的任何项目历史?或者有人有个人经验吗?
网站上有一个客户部分,但唯一的活动链接是同一作者的另一个图书馆(LC ++)。
作为背景:我正在寻找使用现有C ++ API编写低延迟音频插件,我正在寻找允许我以功能样式编写简洁代码的工具。对于这个项目,我不想使用C ++库而不是使用单独的语言,以避免引入FFI绑定(因为复杂性)或垃圾收集(以保持亚毫秒范围内的延迟上限)。
我知道STL和Boost库已经提供了许多FP概念的支持 - 这可能是一种更实用的方法。我也知道其他有用的方法来从函数语言代码生成音频DSP代码,例如FAUST项目或Haskell synthesizer package。
答案 0 :(得分:8)
这不是你的问题的答案,但我将功能风格嵌入命令式语言的经验令人沮丧。虽然代码几乎可以简洁,但它仍然保留了命令式语言中推理的复杂性。
嵌入的复杂性通常需要对语言的细节和极端情况有最深入的了解。这极大地增加了抽象成本,因为必须始终仔细考虑这些事情。并且抽象成本如此之高,只需在惰性流生成器中放置一个有效的函数然后就会出现细微的错误。
FC ++的一个例子:
struct Insert : public CFunType<int,List<int>,List<int> > {
List<int> operator()( int x, const List<int>& l ) const {
if( null(l) || (x > head(l)) )
return cons( x, l );
else
return cons( head(l), curry2(Insert(),x,tail(l)) );
}
};
struct Isort : public CFunType<List<int>,List<int> > {
List<int> operator()( const List<int>& l ) const {
return foldr( Insert(), List<int>(), l );
}
};
我相信这是在尝试表达以下Haskell代码:
-- transliterated, and generalized
insert :: (Ord a) => a -> [a] -> [a]
insert x [] = [x]
insert x (a:as) | x > a = x:a:as
| otherwise = a:insert x as
isort :: (Ord a) => [a] -> [a]
isort = foldr insert []
随着程序的增长,我将让您判断方法的复杂性。
我认为代码生成是一种更具吸引力的方法。您可以将自己限制在目标语言的微小子集中,从而可以轻松地移植到不同的目标语言。诚实的函数式语言中的抽象成本几乎为零,因为毕竟它们是为此而设计的(正如在命令式语言中对命令式代码的抽象相当便宜)。
答案 1 :(得分:6)
我是FC ++的主要原始开发者,但我已经六年多没有参与过了。那段时间我没有跟上C ++ / boost的步伐,所以我不知道FC ++现在如何比较。新的C ++标准(以及像VC ++这样的实现)有一些像lambda和类型推断帮助这样的东西,它们可以解决其中的一些问题。尽管如此,仍然可能存在有用的位,例如惰性列表类型和类似Haskell(以及类似命名的)组合器。所以我想尝试看看。
(因为你提到实时,我应该提到列表使用引用计数,所以如果你'丢弃'一个长列表,在析构函数中可能会有一个非平凡的等待,因为所有单元格的引用计数都是我认为通常在具有无限流/列表的流式场景中这是一个非问题,因为您通常只是tail
进入流,并且只在流式传输时一次取消分配一个节点。)