如果我定义

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/

10-11 23:03
查看更多