陈述语言

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时,它更加可见,下面是典型的例子:

  1. 我们宣布各个人之间的关系:

    father(luke, anakin).
    father(anakin, a_slave_on_tattouin).
    father(a_slave_on_tattouin, someone).
    father(someone, adam).
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后我们说某人的祖先是他的父亲或他父亲的祖先:

    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)

意思VeryOldYoung祖先,如果OldYoung父亲,VeryOldOld祖先.

并且;意味着或者.因此,这里的Prolog告诉我们,路有4个祖先anakin,a_slave_on_tattouin等等.

正如您所看到的,我们没有详细说明算法,Prolog仍然可以做很棒的事情,例如向我们提供luke家谱的所有细节.它是声明性编程的强大功能:你指定数据,这就是你关心的,其余的是处理编译器的聪明人的工作.

  • 这些_are_算法也是如此; 不仅仅是"图灵感",而是"教会意义". (7认同)