gpt4 book ai didi

haskell - 为什么我可以在单独的 IHaskell Notebook 单元格中更改变量的类型?

转载 作者:行者123 更新时间:2023-12-02 16:48:51 25 4
gpt4 key购买 nike

如果我定义

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

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

thing :: Thing
thing = 4

我收到了预期的错误(“没有由文字‘4’产生的 (Num Thing) 实例”)。但是如果我首先完成有效的绑定(bind)

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 shadows 的第二个定义,因为它采用相同的名称,但不会以任何其他方式影响它。

单单元格示例有点令人困惑:本质上,:t 将单元格分隔为多个定义。使用:t,就好像您有两个单元格;如果没有它,就好像您同时尝试以两种不同的方式定义 x — 即使它们具有相同的类型,这也不会起作用。

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

:set -fwarn-name-shadowing

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

:set -Wall

关于haskell - 为什么我可以在单独的 IHaskell Notebook 单元格中更改变量的类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32102540/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com