Haskell是一种强类型编程语言吗?

时间:2015-12-15 11:09:41

标签: haskell type-systems

Haskell是强类型的吗?即是否可以在分配变量后更改变量的类型?我似乎无法在互联网上找到答案。

4 个答案:

答案 0 :(得分:85)

静态 - 在编译时已知类型。 Java和Haskell有静态类型。还有C / C ++,C#,Go,Scala,Rust,还列出了一些。

静态类型语言可能有也可能没有类型推断。 Java几乎完全没有类型推断(但它只是稍微改变一点点); Haskell具有完整的类型推断(除了某些非常高级的扩展)。

(类型推断是指您只需手动声明最少量的类型,例如var isFoo = truevar person = new Person(),而不是bool isFoo = ...Person person = ...。)< / p>

动态 - Python,JavaScript,Ruby,PHP,Groovy,Clojure,Erlang,大多数Lisps等。有些人称之为“#34;统一&#34 ;;动态可以被模仿&#34;在静态设置中但反之则不然,除非您将外部静态分析工具/插件添加到动态类型语言中。有些语言混合了动态和静态。

在某些语言中,还可以在导入时运行按模块进行的广告(渐进式)静态类型,例如:Python+MypyTyped ClojureJavaScript+Flow,{ {3}}仅举几例。

- 旨在被视为Cat的值始终为;试图像对待Dog那样对待他们会导致大声meeewww ......我的意思是错误。

- 这实际上归结为2个相似但不同的东西:类型强制(例如PHP中的"5"+3等于8 - 或者它!)和内存重新解释(例如,C中的(int) someCharValue(bool) somePtr以及C ++,但C ++希望您明确说出reinterpret_cast)。因此,实际上强制 - 弱重新解释 - 弱,并且不同语言在这些方式中的一种或两种方式都很弱。

有趣的是,请注意强制本质上是隐含的,并且内存重新解释是明确的(除了在汇编中) - 因此弱类型包含隐式显式行为。也许这更有理由在弱类型下引用2个不同的子类别。

有些语言包含所有4种可能的组合,以及其变化/等级。

Haskell是静态的+强大的;当然它有unsafeCoerce所以它有时可以是静态的+有点重新解释 - 但是unsafeCoerce非常不受欢迎,除非在极端的情况下你确定某些事情是这样的,但只是可以& #39;似乎说服编译器没有一路回来,并以不同的方式重述整个故事。

C是静态+弱因为所有内存都可以自由地重新解释为它原本不包含的内容,因此很弱。但所有这些重新解释都由类型检查器跟踪,所以仍然完全静态。但是C不做隐式强制,所以它只是重新解释 - 弱

Python是动态的+几乎完全强大 - 在执行期间到达该行之前,在任何给定的代码行上都没有已知类型,但是在运行时生存的值确实具有与它们相关联的类型,重新诠释记忆是不可能的。隐含强制也被保持在一个有意义的最小值,因此有人可能会说Python强99.9%而且0.01%强制弱

PHP和JavaScript是动态的+大部分是弱的 - 动态的,因为在执行和内省其内容之前没有任何类型,并且在强制发生的情况下也一直存在并且使用“#39”除非你只调用方法和函数而不使用内置操作,否则d永远不会真正期望被强制。这些强制行为是互联网上许多幽默的源泉。没有内存重新解释,因此PHP和JS 强制弱

此外,有些人喜欢认为静态类型是关于具有类型的变量,而强类型是关于具有类型的值 - 这是一种非常有用的方式来理解整个画面,但它是不完全正确:一些动态类型语言还允许使用在运行时强制执行的类型/约束来注释变量/参数。

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

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

最后一个例子

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

在静态打字中,这些盒子看起来不同,并且上面有贴纸,上面写着什么。

有些人喜欢它,因为他们可以只使用一个盒子外形而不必在盒子上放置任何标签 - 它只是隐含地相互关联的盒子的排列(并希望提供类型理智。

有些人也喜欢它,因为它允许他们做各种各样的技巧,老虎暂时被装在像狮子一样的盒子里运输,而熊则放在与狼或鹿相同的相互连接的盒子中。

在这种无标签的运输箱设置中,需要播放或模拟所有可能的逻辑场景,以便检测隐式布置中的未对准,如在舞台表演中。一般而言,不能仅根据推理给出可靠的保证。 (需要整个系统启动的临时测试用例,以获得其完整性的任何部分结论)

通过标签和关于如何处理各种标签盒的明确规则,可以使用自动/机械化逻辑推理来得出物流系统无法做到或将要做的事情的结论(静态验证,正式证明,或者至少是像QuickCheck那样的伪证明),物流的某些方面仍然需要通过试运行进行验证,例如物流团队是否让客户正确。 (集成测试,验收测试,最终用户健全性检查)。

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

但是如果你在盒子里添加标签,那么将弗兰肯斯坦猫放入猫盒中仍然很重要。 (静态+弱打字)

在强烈的打字中,虽然你可以把一只猫放在一只狗的盒子里,但你只能继续假装它是一只狗,直到你试图通过喂它来羞辱它只有狗会吃的东西 - 如果发生这种情况它会大声尖叫,但直到那个时候,如果你进行动态打字,它会默默地接受它的位置(在一个静止的世界中它会拒绝被放入狗的盒子里然后你可以说&#34; kitty&#34;)。

答案 1 :(得分:7)

您似乎混淆了动态/静态和弱/强类型。

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

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

Haskell是静态和强类型的。

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

编辑:但就像goldenbull所说,那些打字概念没有明确定义。

答案 2 :(得分:0)

强类型。请参阅此处的第2.3节:Why Haskell matters

答案 3 :(得分:0)

我认为你在谈论两件不同的事情。

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

强打字是另一个话题。是的,haskell是强类型的,大多数FP语言也是如此。强类型赋予FP“类型推断”的能力,这有助于消除编译时隐藏的错误,并有助于减少源代码的大小。

也许你正在将haskell与python进行比较? Python也是强类型的。 haskell和python之间的区别是“静态类型”和“动态类型”。术语“强类型”和“弱类型”的实际含义是模糊和模糊的。那是另一个长篇故事...