gpt4 book ai didi

haskell - 数据结构的惰性评估

转载 作者:行者123 更新时间:2023-12-04 14:44:41 25 4
gpt4 key购买 nike

我正在阅读有关 haskell 中的惰性评估并有一个问题。例如,我们有以下计算:

Prelude> let x = 1 + 1 :: Int
Prelude> let y = (x,x)

在获得 x 的值之后:
Prelude> :sprint x
x = _

它是未经评估的。好的,现在让我们获取 y 的值:
Prelude> :sprint y
y = (_,_)

它也未被评估,因为 y取决于 x and it's unevaluated .现在让我们试试同样的例子,但没有 ::Int :
Prelude> let x = 1 + 1
Prelude> let y = (x, x)
Prelude> :sprint y
y = _

为什么 y值为 _而是 (_, _)当我们尝试不使用 ::Int 时?

我看到它们有不同的类型:
Prelude> let x = 1 + 1
Prelude> :t x
x :: Num a => a
Prelude> let x = 1 + 1 :: Int
Prelude> :t x
x :: Int

但是为什么 y 的值取决于它?

谢谢你。

最佳答案

发生的情况是,当您指定 x有类型Num a => a , 编译器不可能知道 Num 的哪个实例在执行 1 + 1 时使用.它的作用是使用默认值。 GHC 为某些类型类定义了默认类型,因此当无法确定使用哪种具体类型时,它仍然可以提供有意义的结果而不会引发错误。所以当你看到

> let x :: Num a => a
| x = 1 + 1
> x
2
> :sprint x
x = _

这是因为 GHCi 选择 Integer作为 Num 的默认类型,但是当它执行此操作时,它不会将结果存储在 x的内存位置,因为没有办法知道这是否是正确的答案。这就是为什么您会看到 x = _来自 :sprint ,它实际上并没有评估 x :: Num a => a ,已评估 x :: Integer .你甚至可以自己弄乱这个默认值:
> newtype MyInt = MyInt Int deriving (Eq)
>
> instance Show MyInt where
| show (MyInt i) = show i
> instance Num MyInt where
| (MyInt x) + (MyInt y) = MyInt (x - y)
| fromInteger = MyInt . fromInteger
>
> default (MyInt)
> x
0

所以现在我们已经说过 1 + 1 = 0 !请记住,您可能永远不会使用 GHC 的此功能,但了解一下是件好事。

关于haskell - 数据结构的惰性评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24962582/

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