Chr*_*yen -4 haskell imperative-languages imperative-programming declarative-programming
我正在阅读一篇关于声明性编程语言的文章.
如果我不理解这种类型/范式的编程语言的质量,并且它与命令式语言形成鲜明对比,那么我是否应该阅读这种类型的编程语言(如Haskell)中的编程,然后再阅读该文章?
m09*_*m09 10
声明范式的要点是懒惰.我们,声明性程序员,喜欢让编译器完成所有工作.尽可能经常,我们不指定我们想要使用的算法,而只指定我们想要的结果的定义.
例如,如果在命令式设置中你想要计算直到的整数之和n,你可以写(在C中):
int f(int n) {
int result = 0, i = 1;
for(;i <= n; i ++)
result += i;
return result;
}
Run Code Online (Sandbox Code Playgroud)
在声明性设置中,您只需声明此总和(在Haskell中):
f 0 = 0
f n = n + f (n - 1)
Run Code Online (Sandbox Code Playgroud)
这不是算法,它只是一个定义.但是Haskell编译器非常聪明,无论如何都能得到我们的结果.
当你切换到Prolog时,它更加可见,下面是典型的例子:
我们宣布各个人之间的关系:
father(luke, anakin).
father(anakin, a_slave_on_tattouin).
father(a_slave_on_tattouin, someone).
father(someone, adam).
Run Code Online (Sandbox Code Playgroud)然后我们说某人的祖先是他的父亲或他父亲的祖先:
ancestor(Young, Old) :-
father(Young, Old).
ancestor(Young, VeryOld) :-
father(Young, Old),
ancestor(Old, VeryOld).
Run Code Online (Sandbox Code Playgroud)它就是这样,Prolog可以释放魔法并回答如下问题:
?- ancestor(luke, X).
X = anakin ;
X = a_slave_on_tattouin ;
X = someone ;
X = adam ;
false.
Run Code Online (Sandbox Code Playgroud)
有些人帮助阅读上述内容:Head :- Body意味着Head 是否 Body.所以上面,
ancestor(Young, VeryOld) :-
father(Young, Old),
ancestor(Old, VeryOld).
Run Code Online (Sandbox Code Playgroud)
意思VeryOld是Young祖先,如果Old是Young父亲,VeryOld是Old祖先.
并且;意味着或者.因此,这里的Prolog告诉我们,路有4个祖先anakin,a_slave_on_tattouin等等.
正如您所看到的,我们没有详细说明算法,Prolog仍然可以做很棒的事情,例如向我们提供luke家谱的所有细节.它是声明性编程的强大功能:你指定数据,这就是你关心的,其余的是处理编译器的聪明人的工作.