gpt4 book ai didi

haskell - 拥抱类型签名包含额外的类型约束?

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

在玩 Haskell 时遇到了这个问题,我很难过:

Hugs> :type (\x -> x^2)
\x -> x ^ 2 :: (Integral a, Num b) => b -> b

什么是 a在那里做什么?我该怎么读?如果我在 GHCi 中输入相同的内容,它会给出我期望的输出:
Prelude> :type (\x -> x^2)
(\x -> x^2) :: Num a => a -> a

这是 Hugs 中的错误吗?

最佳答案

Integral约束来自 2 的指数.请记住,在 Haskell 中,整型文字实际上是 Num a => a 类型的多态值。 .然后编译器推断,因为它被用作 (^) :: (Num a, Integral b) => a -> b -> a 的指数。 ,它必须是更受约束的类型 Integral a => a .

为了避免在代码中消除数字文字的歧义,Haskell 使用 type defaulting为任何不受约束的数字类型选择一个合理的具体类型。在这种情况下,这将是 Integer .区别似乎是:type在 Hugs 报告发生这种情况之前推断的类型,而 GHCi 在应用类型默认值之后报告类型。

如果您自己为指数指定具体类型,则额外约束将消失。

Hugs> :type (\x -> x^(2 :: Integer))
\x -> x ^ 2 :: Num a => a -> a

关于haskell - 拥抱类型签名包含额外的类型约束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7998226/

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