首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么我可以在单独的IHaskell笔记本单元格中更改变量的类型?

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

Stack Overflow用户
提问于 2015-08-19 18:02:40
回答 1查看 67关注 0票数 2

如果我定义

代码语言:javascript
复制
data Thing = Shoe
           | Ship
           | SealingWax
           | Cabbage
           | King

然后在IHaskell笔记本中的后一个单元格中输入

代码语言:javascript
复制
thing :: Thing
thing = 4

我得到了一个错误(从文字‘4’中产生的(Num东西)没有实例)。但是,如果我首先完成一个有效的绑定

代码语言:javascript
复制
thing :: Thing
thing = King

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

代码语言:javascript
复制
thing = 4

我没有错误,t: thing生成thing :: (Num a) => a

更令人困惑的是,如果我

代码语言:javascript
复制
thing = Cabbage
:t thing
thing = 5
:t thing

在一个单元格中,我没有错误,而且

代码语言:javascript
复制
thing :: Thing
thing :: (Num a) => a

但是没有:t线的单个细胞

代码语言:javascript
复制
thing = Cabbage
thing = 5

给出错误:

代码语言:javascript
复制
Multiple declarations of ‘thing’
Declared at: :1:1
             :2:1

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-08-19 18:08:00

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

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

单个单元格的例子更令人困惑:本质上,一个:t将单元格划分为多个定义。使用:t,就好像您有两个单元;没有它,就好像您同时尝试用两种不同的方式定义x --即使它们具有相同的类型,这也是行不通的。

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

代码语言:javascript
复制
:set -fwarn-name-shadowing

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

代码语言:javascript
复制
:set -Wall
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32102540

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档