Haskell是强类型编程语言吗?< / h1 >



Haskell是强类型的吗?也就是说,是否有可能改变一个变量的类型后,你分配一个?我在网上似乎找不到答案。

Static-类型在编译时是已知的。Java和Haskell有静态类型。还有C/c++, c#, Go, Scala, Rust, Kotlin, Pascal等等。

静态类型语言可能有也可能没有类型推断。Java几乎完全没有类型推断(但它正在缓慢地改变一点点);Haskell有完整的类型推断(除了某些非常高级的扩展)。(类型推断是当您只需要手工声明少量类型时,例如var isFoo = truevar person = new Person(),而不是bool isFoo = ...Person person = ...。)

动态>- Python, JavaScript, Ruby, PHP, Clojure(和Lisps), Prolog, Erlang, Groovy等。也可称为"unittype";动态类型可以在静态设置中"模拟",但除非使用外部静态分析工具,否则不能反向模拟。有些语言可以混合动态和静态(参见渐进式类型,例如https://typedclojure.org/)。

一些语言在导入时为一个或多个模块启用静态类型,例如:Python+Mypy, Typed Clojure, JavaScript+Flow, PHP+Hack等等。

-打算被视为Cat的值总是如此;试图像对待Dog一样对待它们会导致一个响亮的meeewww…我是说错误。

-这有效地归结为两个相似但不同的事情:类型强制转换(例如,在PHP中"5"+3等于8-或者这样做!)和内存重新解释(例如,在C和c++中(int) someCharValue(bool) somePtr,但c++希望你显式地说reinterpret_cast)。所以确实存在强制弱重新解释弱,不同的语言在这两种方式中有一种或两种弱。

有趣的是,注意强制转换本质上是隐式的,而内存重新解释是显式的(汇编语言除外)——所以弱类型由隐式和显式行为组成。也许这更有理由在弱类型下引用两个不同的子类别。

有所有4种可能组合的语言,以及它们的变化/渐变。

Haskell是static+strong;当然,它有unsafeCoerce,所以它可以是静态的+有时有点重新解释弱,但unsafeCoerce是非常不受欢迎的,除非在极端情况下,你确定的事情是这样的,但似乎不能说服编译器没有回去,以不同的方式重述整个故事。

C是静态的+弱的因为所有的记忆都可以被自由地重新解释为它原本不打算包含的东西,因此是弱的。但是所有这些重新解释都由类型检查器跟踪,所以仍然是完全静态的。但是C语言没有隐式强制,所以只有reinterpret_weak

Python是动态的+几乎完全是强的-在执行过程中,任何给定的代码行在到达该行之前都没有已知的类型,但是在运行时存在的值确实有与它们相关的类型,并且不可能重新解释内存。隐式强制也保持在一个有意义的最小值,所以有人可能会说Python是99.9%强和0.01%强制弱

PHP和JavaScript是动态的+大多是弱的-动态,因为在执行和内省其内容之前,没有任何类型;弱,因为强制操作一直在发生,并且对于您从未真正期望强制的事情,除非您只调用方法和函数而不使用内置操作。这些强制行为是互联网上许多幽默的来源。没有内存重新解释,所以PHP和JS是强制弱


此外,有些人喜欢认为静态类型是关于变量具有类型,而强类型是关于值具有类型——这是一种非常有用的理解全局的方法,但这并不完全正确:一些动态类型语言还允许在运行时强制的类型/约束上对变量/参数进行注释。

在静态类型中,具有类型的表达式;变量具有类型的事实只是变量被用作将较大的表达式与较小的表达式粘合在一起的一种手段的结果,因此变量本身并没有类型。

同样,在动态类型中,不是变量缺乏静态已知类型——而是所有的表达式!缺少类型的变量仅仅是它们存储的表达式缺少类型的结果。


最后一个插图

在动态类型中,所有的猫、狗甚至大象(实际上是整个动物园!)都被包装在相同大小的盒子里。

在静态类型中,这些盒子看起来不同,上面有标签说明里面是什么。

有些人喜欢它,因为他们可以只使用一个盒子的形式因素,而不必在盒子上放任何标签——只有盒子之间的排列才隐含地(并且希望)提供了类型的完整性。

有些人喜欢它还因为它可以让他们做各种各样的把戏,老虎暂时被放在有狮子气味的盒子里,熊被放在和狼或鹿一样的相互连接的盒子里。

在这种运输箱的无标签设置中,需要像舞台表演一样,对所有可能的物流场景进行播放或模拟,以检测隐性安排中的错位。一般来说,仅凭推理不能给出可靠的保证。(需要启动整个系统以获得其可靠性的任何部分结论的特殊测试用例)

有了标签和关于如何处理各种标签的盒子的明确规则,自动化/机械化的逻辑推理可以用来得出物流系统不会做或肯定会做的结论(静态验证,正式证明,或至少像QuickCheck一样的伪证明)。物流的某些方面仍然需要通过试运行来验证,例如物流团队是否得到了正确的客户。(集成测试、验收测试、最终用户完整性检查)。


此外,在弱打字中,狗可以被切割并重新组装成弗兰肯斯坦猫。不管他们喜不喜欢,也不管结果是否丑陋。(弱类型)

但是如果你给盒子加上标签,弗兰肯斯坦猫被放进猫盒子里仍然很重要。(静态+弱类型)


在强类型,而你可以把一只猫在盒子里的一只狗,但你只能继续假装它是一只狗,直到你想羞辱,喂养它只有狗会吃点东西,如果发生这种情况,它会大声尖叫,但是在那之前,如果你在动态类型,它会默默接受它的位置(在一个静态的世界,将垃圾放在狗的盒子之前,你可以说"猫")。

你似乎把动态/静态和弱/强类型搞混了。

动态类型或静态类型是关于变量的类型是否可以在执行期间更改。

弱类型或强类型是关于能够仅从函数签名预测类型错误。

Haskell既是静态类型又是强类型。

然而,在Haskell中没有变量这样的东西,所以谈论动态或静态类型没有意义,因为每个赋值的标识符都不能在执行时更改。

编辑:但是就像goldenbull说的,这些打字的概念并没有明确的定义。

是强类型。为什么Haskell很重要

我想你是在说两件不同的事情。

首先,haskell和大多数函数式编程(FP)语言没有"变量"的概念。相反,它们使用"名称"one_answers"值"的概念,它们只是将值"绑定"到名称。一旦绑定了值,就不能将另一个值绑定到相同的名称,这是FP的关键特性。

强类型是另一个主题。是的,haskell是强类型的,大多数FP语言也是如此。强类型赋予FP"类型推断"的能力,这在消除编译时隐藏的bug和帮助减小源代码的大小方面非常强大。

也许你正在比较haskell和python?Python也是强类型的。haskell和python的区别在于"静态类型"one_answers"动态类型"。术语"强类型"one_answers"弱类型"的实际含义是模糊的。这是另一个很长的故事…

相关内容

最新更新