静态类型不一定需要仪式

译者注:我目前正在准备有关承诺的有关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. -. : .

Source: https://habr.com/ru/post/zh-CN482834/


All Articles