如果我定义
data Thing = Shoe
| Ship
| SealingWax
| Cabbage
| King然后在IHaskell笔记本中的后一个单元格中输入
thing :: Thing
thing = 4我得到了一个错误(从文字‘4’中产生的(Num东西)没有实例)。但是,如果我首先完成一个有效的绑定
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笔记本单元格中更改变量的类型?
发布于 2015-08-19 18:08:00
在Haskell中,您不能更改或重新分配变量。您要做的是声明一个新变量,它只是重用名称shoe,但在其他方面完全不同。
show 的第二个定义第一个阴影,因为它使用相同的名称,但它不会以任何其他方式影响它。
单个单元格的例子更令人困惑:本质上,一个:t将单元格划分为多个定义。使用:t,就好像您有两个单元;没有它,就好像您同时尝试用两种不同的方式定义x --即使它们具有相同的类型,这也是行不通的。
一般来说,在Haskell中隐藏名字有点尴尬,而且风格也不好。您甚至可以启用有关它的警告:
:set -fwarn-name-shadowing它也可以作为一组更大的警告的一部分打开:
:set -Wallhttps://stackoverflow.com/questions/32102540
复制相似问题