2

如果我定义

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

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

thing :: Thing
thing = 4

正如预期的那样,我收到一个错误(“没有由文字'4'引起的(Num Thing)实例”)。但是如果我首先完成一个有效的绑定

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 单元格中更改变量的类型?

4

1 回答 1

5

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

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

单单元格的例子有点混乱:本质上,a:t将单元格分成多个定义。有了:t,就好像你有两个单元格;没有它,就好像您同时尝试以x两种不同的方式进行定义——即使它们具有相同的类型,这也行不通。

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

:set -fwarn-name-shadowing

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

:set -Wall
于 2015-08-19T18:08:00.380 回答