译者注:我目前正在准备有关承诺的有关monad的文章的材料。 不幸的是,这花费了很多时间,更不用说我仍然需要做主要工作并花时间在家庭上,但是这个过程仍在进行。 同时,我向您介绍来自马克·西曼(Mark Seemann)同志的小清新笔记的翻译,我对此感到好奇 。
我经常就静态类型与动态类型进行长时间而激烈的辩论。 我绝对认为自己是静态类型的支持者,但本文不是关于静态类型的优点的。 本文的目的是消除关于静态类型语言的常见误解。
典礼
与动态类型的语言相比,静态类型的语言更喜欢动态类型的语言的人经常强调,缺少仪式会使它们更加高效。 这听起来合乎逻辑,但是,这是错误的二分法。
在开始做自己真正打算做的事情之前,要做的就是仪式。
文卡特·亚拉马尼亚姆
动态类型的语言给人的印象是它们不需要特殊的仪式,但是不能由此得出结论,静态类型的语言需要它们。 不幸的是,所有主流的静态类型语言都属于同一个家族, 它们需要仪式。 我认为人们推断他们对他们的了解,错误地得出结论, 所有静态类型的语言都必须附带开销仪式。
这使我想到了一个不幸的礼仪区 :

当然,此图只是一个简化,但我希望它能说明本质。 C ++,Java和C♯是需要仪式的语言。 在它们的右边是我们可以称为跨仪式的语言,包括F♯和Haskell。
下面,我将显示各种语言的代码。 我们将考虑上述定义的仪式,并注意准备工作的数量,例如创建新文件,声明类,声明类型等。 我留下了与正在讨论的主题无关的代码,以强调我要传达的内容。
Javascript仪式
假设我们有一个数字列表,还有一个数字。 此数字指示应从列表中删除多少个项目。 您需要删除左侧的项目,直到删除的数字总和大于该数字为止。 结果将是列表的其余部分。
> consume ([1,2,3], 1);
[ 2, 3 ]
> consume ([1,2,3], 2);
[ 3 ]
> consume ([1,2,3], 3);
[ 3 ]
> consume ([1,2,3], 4);
[]
, 1, 2, 3, quantity
2 3 . , quantity
4, , . , 1 3.
JavaScript :

JavaScript-, , , , . 17 , . , , , . JavaScript . , , , .
C♯
JavaScript C♯. C♯ :

, . . , , , , .
. int
. , long
?
:

short
? . decimal
? . byte
? .
, .
F♯
F♯ :

, . , :
quantity: ^a -> (seq< ^b> -> seq< ^b>)
when ( ^a or ^b) : (static member ( + ) : ^a * ^b -> ^a) and
^a : (static member get_Zero : -> ^a) and ^a : comparison
, , , , . , decimal
, :
> consume 2 [1;2;3];;
val it : seq<int> = seq [3]
> consume 2m [1m;2m;3m];;
val it : seq<decimal> = seq [3M]
, . consume "foo" [true;false;true]
.
F♯ ( , C♯), : . , " ". , , , , - .
Haskell
Haskell:

. . GHCi , :
> :t consume
consume :: (Foldable t, Ord a, Num a) => a -> t a -> [a]
F♯ , . Foldable
( , . ), , Ord
Num
. Num
, Ord
— .
, F♯ Haskell , . , , C♯ Java. , .
, C++, Java C♯. , , , , .
, .
, F♯ Haskell. -. : .