【问题标题】:Why can I change the type of a variable in separate IHaskell Notebook cells?为什么我可以在单独的 IHaskell Notebook 单元格中更改变量的类型?
【发布时间】:2015-11-13 04:02:42
【问题描述】:

如果我定义

data Thing = Shoe
           | Ship
           | SealingWax
           | Cabbage
           | King

然后在 IHaskell Notebook 的稍后单元格中输入

thing :: Thing
thing = 4

如预期的那样,我收到一个错误(“No instance for (Num Thing) from the literal ‘4’”)。但是,如果我首先完成一个有效的绑定与

thing :: Thing
thing = King

然后,在一个单独的单元格中使用

进行相同(无效)的分配
thing = 4

我没有收到任何错误,t: thing 产生 thing :: (Num a) => a

更令人困惑的是,如果我说的话

thing = Cabbage
:t thing
thing = 5
:t thing

在单个单元格中我没有收到任何错误并且

thing :: Thing
thing :: (Num a) => a

但是没有:t 行的单个单元格

thing = Cabbage
thing = 5

给出一个错误:

Multiple declarations of ‘thing’
Declared at: :1:1
             :2:1

为什么我可以在单独的 IHaskell Notebook 单元格中更改变量的类型?

【问题讨论】:

    标签: haskell types casting ihaskell


    【解决方案1】:

    在 Haskell 中,您不能更改或重新分配变量。您正在做的是声明一个 new 变量,它只是重用 name shoe,但在其他方面完全不同。

    您对show 的第二个定义shadows是第一个,因为它采用相同的名称,但不会以任何其他方式影响它。

    单单元格的例子有点混乱:本质上,:t 将单元格分成多个定义。使用:t,就好像您有两个单元格;如果没有它,就好像您同时尝试以两种不同的方式定义 x — 即使它们具有相同的类型,也不会起作用。

    总的来说,Haskell 中的阴影名称有点尴尬,而且风格不好。您甚至可以启用有关它的警告:

    :set -fwarn-name-shadowing
    

    它也可以作为更多警告的一部分打开:

    :set -Wall
    

    【讨论】:

    • 所以也许问题是为什么我在某些情况下被禁止遮蔽而在其他情况下被允许(见上面的编辑)。
    • 还有:有没有办法配置 Haskell 来警告阴影?
    • @raxacoricofallapatorius:是的。我正准备将其添加到我的答案中:)。您可以打开-fwarn-name-shadowing 标志::set -fwarn-name-shadowing。这肯定适用于ghci可能适用于 IHaskell,但我没有在本地运行它进行测试。
    • 酷。我会看看我是否可以设置 IHaskell 来做到这一点(也许是一个新问题)。
    • @raxacoricofallapatorius:是的。否则会不一致。
    猜你喜欢
    • 2015-06-23
    • 2013-11-03
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 2010-10-01
    • 2021-07-02
    • 1970-01-01
    相关资源
    最近更新 更多