FC++是否被任何开源项目使用?

mat*_*tbh 13 c++ haskell functional-programming

所述FC++库提供一个有趣的方法在C++支撑功能的编程的概念.

FAQ中的一个简短示例:

take (5, map (odd, enumFrom(1)))
Run Code Online (Sandbox Code Playgroud)

FC++似乎从Haskell中获得了很多灵感,从而重用了Haskell前奏中的许多函数名称.

我已经看过最近一篇关于它的文章,并且在stackoverflow的一些答案中已经简要地提到过,但我无法在野外找到它的任何用法.

是否有任何开源项目积极使用FC++?或者过去使用它的任何项目历史?或者有人有个人经验吗?

网站上有一个客户部分,但唯一的活动链接是同一作者的另一个库(LC++).

作为背景:我正在寻找使用现有C++ API编写低延迟音频插件,我正在寻找允许我以功能样式编写简洁代码的工具.对于这个项目,我不想使用C++库而不是使用单独的语言,以避免引入FFI绑定(因为复杂性)或垃圾收集(以保持亚毫秒范围内的延迟上限).

我知道STL和Boost库已经提供了许多FP概念的支持 - 这可能是一种更实用的方法.我也知道其他有用的方法来生成功能语言的代码生成音频DSP代码,例如FAUST项目或Haskell 合成器包.

luq*_*qui 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 );
   }
};
Run Code Online (Sandbox Code Playgroud)

我相信这是试图表达以下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 []
Run Code Online (Sandbox Code Playgroud)

随着程序的发展,我会让你判断方法的复杂性.

我认为代码生成是一种更有吸引力的方法.你可以限制自己的目标语言的一个子集微乎其微,因此很容易移植到不同的目标语言.抽象本着诚实函数式语言的成本几乎为零,因为,毕竟,他们是专为(就像在抽象的命令式语言势在必行代码是相当便宜).


Bri*_*ian 6

我是FC++的主要原创开发人员,但我已经六年多没有参与过了.那段时间我没有跟上C++/boost的步伐,所以我不知道FC++现在如何比较.新的C++标准(以及像VC++这样的实现)有一些像lambda和类型推断帮助这样的东西,它们可以解决其中的一些问题.尽管如此,仍然可能存在有用的位,例如惰性列表类型和类似Haskell(以及类似命名的)组合器.所以我想尝试看看.

(因为你提到了实时,我应该提到列表使用引用计数,所以如果你'丢弃'一个长列表,在析构函数中可能会有一个非平凡的等待,因为所有单元格的引用计数都归零.我认为通常在具有无限流/列表的流式场景中,这是一个非问题,因为您通常只是tail在流中,并且只在流式传输时一次取消分配一个节点.)