Haskell是强类型的吗?即,您可以在分配变量后更改变量的类型吗?我似乎无法在互联网上找到答案.
静态类型在编译时是已知的.Java和Haskell有静态类型.另外还有C/C++,C#,Go,Scala,Rust等.
静态类型语言可能有也可能没有类型推断.Java几乎完全没有类型推断(但它只是稍微改变一下); Haskell具有完整的类型推断(除了某些非常高级的扩展).
(类型推断是,当你只需要申报的各类手工,例如最小量var isFoo = true
和var person = new Person()
,而不是bool isFoo = ...
和Person person = ...
.)
动态 - Python,JavaScript,Ruby,PHP,Groovy,Clojure,Erlang,大多数Lisps等.有些人称之为"统一"; 动态可以在静态设置中"模拟",但反之则不然,除非您将外部静态分析工具/插件添加到动态类型语言中.有些语言混合了动态和静态.
在某些语言中,也可以在导入时运行按模块(逐步)静态类型的广告,例如:Python + Mypy,Typed Clojure,JavaScript + Flow,PHP + Hack等等.
强 - 值Cat
一直被视为值; 试图像对待一个Dog
会造成一个响亮的meeewww
......我的意思是错误.
弱 - 这实际上归结为2个相似但不同的东西:类型强制(例如在PHP中"5"+3
等于8
- 或者它!)和内存重新解释(例如,(int) someCharValue
或者(bool) somePtr
在C和C++中,但是C++希望你明确地说reinterpret_cast
).因此,真正的强制 - 弱和重新解释 - 弱,不同的语言在这些方式中的一种或两种方面都很弱.
有趣的是,请注意强制本质上是隐含的,内存重新解释是明确的(除了在汇编中) - 所以弱类型包含隐式和显式行为.也许这更有理由在弱类型下引用2个不同的子类别.
存在具有所有4种可能组合以及其变化/渐变的语言.
Haskell是静态+强大的 ; 当然它有unsafeCoerce
这样它可以是静态的+有时重新解释 - 弱有时,但是unsafeCoerce
非常不赞成,除非在极端的情况下你确定某些情况,但似乎无法说服编译器而不是全部回归的方式,以不同的方式重述整个故事.
C是静态+弱的,因为所有内存都可以自由地重新解释为它原本不包含的东西,因此很弱.但所有这些重新解释都由类型检查器跟踪,所以仍然完全静态.但是C不做隐式强制,所以它只是重新解释 - 弱.
Python是动态的+几乎完全强大 - 在执行期间到达该行之前,在任何给定的代码行上都没有已知的类型,但是在运行时生存的值确实具有与它们相关联的类型,并且不可能重新解释内存.隐含的强制也被保持在一个有意义的最小值,因此有人可能会说Python强99.9%,强制弱 0.01%.
PHP和JavaScript是动态的+大部分是弱的 - 动态的,因为在你执行和内省它的内容之前没有任何类型,并且在强制一直发生并且你永远不会真正期望被强制的事情上也没有任何类型,除非你是只调用方法和函数而不使用内置操作.这些强制行为是互联网上许多幽默的源泉.没有内存重新解释,所以PHP和JS都是强制性的.
此外,有些人喜欢认为静态类型是关于具有类型的变量,而强类型是关于具有类型的值 - 这是理解整个图片的非常有用的方式,但它不是真的:一些动态类型的语言也是允许使用在运行时强制执行的类型/约束来注释变量/参数.
在静态类型中,它是具有类型的表达式; 具有类型的变量的事实仅仅是变量被用作将较大的表达式从较小的表达式粘合在一起的手段的结果,因此它不是具有类型的变量本身.
类似地,在动态类型中,它不是缺少静态已知类型的变量 - 它是所有表达式!缺少类型的变量仅仅是它们存储缺少类型的表达式的结果.
最后一个例子
在动态打字中,所有猫,狗甚至大象(实际上是整个动物园!)都打包在相同大小的盒子里.
在静态打字中,这些盒子看起来不同,并且在它们上面有贴纸,上面写着什么.
有些人喜欢它,因为它们可以只使用一个盒子形状因子而不必在盒子上放置任何标签 - 它只是相互之间的盒子的排列,隐含地(并且希望)提供类型的健全性.
有些人也喜欢它,因为它允许他们做各种各样的技巧,老虎暂时被运送在像狮子一样闻起来的盒子里,而熊则放在与狼或鹿相同的相互连接的盒子中.
在这种无标签的运输箱设置中,需要播放或模拟所有可能的逻辑场景,以便检测隐式布置中的未对准,如在舞台表演中.一般而言,不能仅根据推理给出可靠的保证.(需要整个系统启动的临时测试用例,以获得其完整性的任何部分结论)
通过标签和关于如何处理各种标签盒的明确规则,可以使用自动/机械化逻辑推理来得出物流系统不会做什么或将要做什么的结论(静态验证,形式证明或在最简单的伪证明,如QuickCheck),物流的某些方面仍需要通过试运行进行验证,例如物流团队是否能够确保客户正确.(集成测试,验收测试,最终用户健全性检查).
此外,在弱的打字中,狗可以被切成片并重新组装成弗兰肯斯坦猫.他们是否喜欢,以及结果是否丑陋.(弱打字)
但是如果你在盒子里添加标签,那么将弗兰肯斯坦猫放入猫盒中仍然很重要.(静态+弱打字)
在强烈的打字中,虽然你可以把一只猫放在一只狗的盒子里,但是你只能继续假装它是一只狗,直到你试图通过喂它来羞辱它只有狗吃的东西 - 如果发生这种情况,它会大声尖叫,但直到那个时候,如果你在动态打字,它会默默地接受它的位置(在一个静态的世界里,它会拒绝被放入狗的盒子,然后才能说"小猫").
你似乎混淆了动态/静态和弱/强类型.
动态或静态类型是指在执行期间是否可以更改变量的类型.
弱或强类型是关于能够仅从函数签名预测类型错误.
Haskell既有静态也有强类型.
但是,在Haskell中没有变量这样的东西,所以谈论动态或静态类型是没有意义的,因为在执行时不能更改分配了值的每个标识符.
编辑:但就像goldenbull所说,那些打字概念没有明确定义.