Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是FC++;被任何开源项目使用? 库提供了一种有趣的方法来支持C++中的函数编程概念。_C++_Haskell_Functional Programming - Fatal编程技术网

是FC++;被任何开源项目使用? 库提供了一种有趣的方法来支持C++中的函数编程概念。

是FC++;被任何开源项目使用? 库提供了一种有趣的方法来支持C++中的函数编程概念。,c++,haskell,functional-programming,C++,Haskell,Functional Programming,下面是一个简短的示例: FC++似乎从Haskell中获得了很多灵感,重用了Haskell前奏曲中的许多函数名 我最近看过一篇关于它的文章,在一些关于stackoverflow的回答中也简要提到了它,但我在野外找不到它的任何用法 是否有任何积极使用FC++的开源项目?或者过去使用过它的项目的历史?或者有没有人有过这种经历 网站上有一个客户部分,但唯一的活动链接是同一作者(LC++)创建的另一个库 作为背景:我想用现有的C++ API编写低延迟音频插件,我在寻找工具,让我能够以功能风格编写简洁代码

下面是一个简短的示例:

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

我最近看过一篇关于它的文章,在一些关于stackoverflow的回答中也简要提到了它,但我在野外找不到它的任何用法

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

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

作为背景:我想用现有的C++ API编写低延迟音频插件,我在寻找工具,让我能够以功能风格编写简洁代码。对于这个项目,我不使用C++库而不是使用单独的语言,以避免引入FFI绑定(因为复杂性)或垃圾收集(以保持在子毫秒范围内的延迟上限)。p>
我知道STL和Boost库已经提供了许多FP概念的支持——这可能是一种更实用的方法。我还知道从函数式语言生成音频DSP代码的其他有前途的方法,例如project或Haskell。

这并不是对你问题的正确回答,但我在将函数式风格嵌入命令式语言方面的经验非常可怕。虽然代码几乎同样简洁,但它保留了命令式语言中推理的复杂性

嵌入的复杂性通常需要对语言的细节和具体情况有最深入的了解。这大大增加了抽象的成本,因为必须始终仔细考虑这些事情。由于抽象的成本如此之高,在惰性流生成器中放置一个副作用函数,然后死于微妙的bug就更容易了

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 );
   }
};
随着程序的发展,我将让您判断方法的复杂性


我认为代码生成是一个更吸引人的方法。您可以将自己限制在目标语言的一个很小的子集内,这样就可以很容易地移植到不同的目标语言。在一种诚实的函数式语言中进行抽象的成本几乎为零,因为它们毕竟是为此而设计的(正如在命令式语言中抽象命令式代码是相当便宜的)。

我是FC++的主要原始开发人员,但我已经六年多没做过这方面的工作了。在那段时间里,我还没有跟上C++/boost的步伐,所以我不知道现在FC++的性能如何。新的C++标准(和VC++一样的实现)有点像lambda和类型推断帮助,这使得一些在里面的东西不太实际。尽管如此,仍然可能有一些有用的位,比如惰性列表类型和类似Haskell(名称类似)的组合符。所以我想试试看


(因为您提到了实时,我应该提到列表使用引用计数,所以如果您“丢弃”一个长列表,当所有单元格的引用计数都变为零时,析构函数中可能会有一个非常重要的等待。我认为,通常在无限流/列表的流场景中,这不是问题,因为您通常只是
tail
“就像在命令式语言中对命令式代码进行抽象是相当便宜的”不总是这样;看看Java。函数式语言中的抽象功能对命令式代码同样有用。缺少这些功能不是“范例”,这只是一个设计缺陷。谢谢,这真的很有用——我将首先尝试代码生成方法。在Haskell中使用EDSL生成低级别的时间敏感代码将是理想的。此外,还有许多现有的DSP和实时嵌入式软件开源项目采用类似的方法,包括FAUST、Feldspar和Haskell Synthes谢谢你的信息。知道什么样的方法会让析构函数时间保持低点是非常有用的,因为这是我考虑C++的主要原因。
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 );
   }
};
-- 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 []