- val l1 = 1 :#: 2 :#: 3 :#: VNil
- val l2 = 1 :#: 2 :#: VNil
- val l3 = l1 vAdd l2
- // Result: a *compile* error because you can't pairwise add vectors
- // of different lengths!
Shapeless 是一个仍然有点粗拙的看维只支撑依附类型的一个子集,并有相当冗长的代码和类型签名。相反,Idris使得类型成为编程说话的第一类成员,是以依附类型体系似乎加倍强大年夜和干净。为了进行比较,请查看Scala vs Idris:相干类型,如今以及将来的评论辩论。
连贯说话

示例说话:Forth, cat,joy
有没有想过不消变量和函数应用法度榜样编程会是什么样子?至少我没有,但显然有些人这么想了,他们提出了持续编程。这个设法主意是,说话中的所有内容都是将数据推送到客栈或大年夜客栈中弹出数据的函数; 法度榜样几乎完全经由过程功能组合(串联组合)来构建。
这听起来很抽象,所以我们来看看cat中的一个简单例子 :
- 2 3 +
- def foo {
- 10 <
- [ 0 ]
- [ 42 ]
- if
- }
- 20
- foo
让我们一行一行地浏览一下:
- 起首,我们声明一个函数foo。请留意,cat中的函数没有指定输入参数:所有参数都大年夜客栈中隐式攫取。
- foo调用<函数,该函数弹出的第一项在客栈中,将它与10,并且推动任一True或 False后头压入客栈。
- 接下来,我们将值0和42输入客栈:我们将它们包含在括号中以确保它们未被履行就推入客栈。这是因为它们将分别用于调用if下一行函数的“then”和“else”分支。
- 该if函数大年夜客栈中弹出3个项目:布尔前提,“then”分支和“else”分支。根据布尔前提的值,它会将“then”或“else”分支的结不雅输回客栈。
- 最后,我们将20输入客栈并调用foo函数。
- 当所有的工作都做完后,会获得一个42的结不雅
这种编程风格颇有趣味:法度榜样可以以无数种方法拆分和连接以创建新法度榜样; 异常简单的语法(甚至比LISP更简单),导致异常简洁的法度榜样; 也具有强大年夜的元编程支撑。看起来你必须记住或想象客栈的当缁ご态,而不是可以或许大年夜代码中的变量名称中攫取它,这可能使得很难揣摸代码。
示例说话:Prolog, SQL
声明式编程已经存在了很多年,但大年夜多半法度榜样员仍然不知道这个概念。这里的要点是:在大年夜多半主流说话中,你须要描述若何解决一个特定的问题; 在声明性说话中,你只需描述你想要的结不雅,而说话本身就能找出达到那边的办法。
例如,如不雅内涵C中大年夜头开端编写排序算法,例如编写归并排序的指令,该指令慢慢描述若何递归地将数据集分成一半并按排次序序归并到一路。如不雅您应用像Prolog如许的声明性说话对数字进行排序 ,则应当描述所需的输出:“我须要雷同的值列表,但索引中的每个项目 i应小于或等于索引处的项目i + 1”。将以前的C解决筹划与此Prolog代码进行比较:
- sort_list(Input, Output) :-
- permutation(Input, Output),
- check_order(Output).
- check_order([]).
- check_order([Head]).
- check_order([First, Second | Tail]) :-
- First =< Second,
- check_order([Second | Tail]).
声明性说话的好梦之处在于它许可你在更高层次的抽象中工作:你只须要描述所需输出的规范。例如,prolog中简单数独求解器的代码,只是列出懂得决的数独谜题的每行,每列和对界线应当是什么样的:
推荐阅读
因为工作的关系,笔者一向慎密跟踪国内私有云市场的成长,并有幸介入个中;也是因为工作的关系,笔者接触了很多没有广泛传播的消息素材。对于私有云这个概念,似乎国内大年夜局已定,几无悬念。笔者一向>>>详细阅读
本文标题:6个新奇的编程方式,改变你对编码的认知
地址:http://www.17bianji.com/lsqh/40608.html
1/2 1