C++模版编程实现Haskell的函数模式匹配特性[图]:
大神 Bartosz Milewski 在2009年写了一篇文章《What Does Haskell Have to Do with C++?》,使用C++实现Haskell函数式编程语言的一些特性。【传送门在文末】
其中有这样一段例子:
// code 1
1.template<int n>class fact {
2.public:
6.template<>class fact<0>{// specialization for n = 0
7.public:
/ 第6行代码是“特化”类模版fact,
也就是显式地给出某种类型参数的
类模板的一个实例的代码,而非由
编译器生成。
在这里,是给出了参数n为0时模板
fact的代码。这样,编译器不会再
根据类模版fact生成n=0时的代码
关于模版特化,详见文末链接
/
6.template<>class fact<0>{// specialization for n = 0
7.public:
当程序员调用【fact 8】的时候(参数是8,因为Haskell函数调用一般不像C++那样给参数加括号),Haskell会将之匹配到上面代码的第2行。谁动了我的奶酪读书笔记(http://www.simayi.net/dushubiji/6208.html)摘抄好词好句及感悟赏析,这种参数匹配,是Haskell特有的函数声明与调用方式。
所以前面的code1中C++模版代码,就是在模仿 code4 中的Haskell代码。
下面给出一个完整的Haskell程序
moduleFactwhere
importSystem.IO
fact::Integer->Integer
fact0=1
fact n = n * fact (n-1)
main::IO()
main=do
putStrLn $"8! = "++ show (fact 8)
putStrLn $"88! = "++ show (fact 88)
上面的代码输出结果是:
8! = 40320
88! =185482642257398439114796845645546284380220968949399346684421580986889562184028199319100141244804501828416633516851200000000000000000000
Haskell对C++说:我能算88!,你行吗?
C++说:你欺负人!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。