如果我定义
data Thing = Shoe
| Ship
| SealingWax
| Cabbage
| King
然后在IHaskell Notebook的后面的单元格中输入
thing :: Thing
thing = 4
我收到预期的错误(“没有数字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中,您无法更改或重新分配变量。您正在做的是声明一个新变量,该变量仅重用名称shoe
,但在其他方面则完全不同。
您对show
的第二个定义遮盖了第一个,因为它具有相同的名称,但不会以任何其他方式影响它。
单单元格的示例有些混乱:从本质上讲,:t
将单元格分成多个定义。使用:t
,就好像您有两个单元格一样。如果没有它,就好像您同时尝试以两种不同的方式定义x
一样,即使它们具有相同的类型也行不通。
通常,在Haskell中用阴影标记名称有点尴尬,风格也不好。您甚至可以启用有关它的警告:
:set -fwarn-name-shadowing
也可以将其作为更大的警告集的一部分打开:
:set -Wall
关于haskell - 为什么要在单独的IHaskell Notebook单元中更改变量的类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32102540/