Haskell的类型系统是强类型的吗?也就是说,分配了变量后是否可以更改其类型?我在互联网上找不到答案。
Haskell的类型系统是强类型的吗?也就是说,分配了变量后是否可以更改其类型?我在互联网上找不到答案。
静态 - 类型在编译时已知。Java和Haskell具有静态类型。还包括C / C ++,C#,Go,Scala,Rust,Kotlin,Pascal等。
静态类型语言可能具有类型推断,也可能没有。 Java几乎完全缺乏类型推断(但它正在很慢地稍微改变); Haskell具有完整的类型推断(除了某些非常高级的扩展之外)。
(类型推断是指您只需手动声明最少量的类型,例如var isFoo = true
和var person = new Person()
,而不是bool isFoo = ...
和Person person = ...
。)
动态 - Python,JavaScript,Ruby,PHP,Clojure(以及Lisp总体),Prolog,Erlang,Groovy等。也可以称为“一种类型”;动态类型可以在静态设置中“模拟”,但反之则不成立,除非使用外部静态分析工具。一些语言使混合动态和静态成为可能(参见渐进类型,例如:https://typedclojure.org/)。
一些语言允许为一个或多个模块启用静态类型,应用于导入时间,例如:Python+Mypy,Typed Clojure,JavaScript+Flow,PHP+Hack等。
强 - 所有想要被视为Cat
的值都将被视为Cat
;试图将它们视为Dog
将导致一个大声的meeewww
……我是指错误。
弱 - 这实际上归结为2个相似但不同的事物:类型强制转换(例如,在PHP中,"5"+3
等于8
- 或者是吗!)和内存重新解释(例如,在C中的(int) someCharValue
或(bool) somePtr
以及C ++中也是如此,但是C ++希望您明确说明reinterpret_cast
)。因此,实际上有强制-弱和重新解释-弱之分,不同的语言在这两种方式中都是弱的。
有趣的是,注意强制转换天生就是隐式的,而内存重新解释是显式的(除了汇编语言)。因此,弱类型由一个隐式和一个显式的行为组成。也许这更是将弱类型归为两个不同的子类别的原因。
有些人喜欢它是因为它允许他们在装有闻起来像狮子的盒子中暂时运输老虎,并将熊放置在与狼或鹿相连的盒子阵列中进行各种花招。
在这种没有标签的运输箱设置中,所有可能的逻辑场景需要播放或模拟,以便检测隐式排列中的不对齐情况,就像在舞台表演中一样。一般而言,仅凭推理无法给出可靠的保证。(需要启动整个系统才能得出其健全性的部分结论的即兴测试用例)
通过为各种标签的盒子添加标签和显式规则,可以使用自动化/机械化的逻辑推理来得出有关物流系统不会执行或肯定会执行的结论(静态验证、形式证明或至少类似QuickCheck的伪证明)。物流的某些方面仍然需要通过试运行进行验证,例如物流团队是否正确理解了客户要求。(集成测试、验收测试、最终用户合理性检查)。
此外,在弱类型语言中,狗可以被切割并重新组装成弗兰肯斯坦猫。无论它们喜欢与否,结果是否难看。(弱类型)
但是,如果您为盒子添加标签,仍然很重要将弗兰肯斯坦猫放入猫的盒子中。(静态+弱类型)
在强类型语言中,虽然您可以将猫放入狗的箱子中,但只有在您尝试通过喂它只有狗才会吃的东西来羞辱它时,才能继续假装它是一只狗——如果发生这种情况,它会大声尖叫,但在那之前,在动态类型环境中,它会默默地接受自己的位置(在静态世界中,它会拒绝被放入狗的盒子中,还没等你说出“小猫”)。
我认为你在谈论两件不同的事情。
首先,Haskell和大多数函数式编程(FP)语言都没有“变量”这个概念。相反,它们使用“名称”和“值”的概念,只是将一个值“绑定”到一个名称上。一旦值被绑定,就不能再将另一个值绑定到同一个名称上,这是FP的关键特征。
强类型是另一个话题。是的,Haskell是强类型的,大多数FP语言也是强类型的。强类型赋予FP“类型推断”的能力,这种能力可以在编译时消除隐藏的错误,并帮助减少源代码的大小。
也许你正在将Haskell与Python进行比较?Python也是强类型的。Haskell和Python之间的区别在于“静态类型”和“动态类型”。术语“强类型”和“弱类型”的实际含义是模糊不清的。这是另一个漫长的故事……