gpt4 book ai didi

haskell - 为什么在 Haskell 中没有推断出多态值?

转载 作者:行者123 更新时间:2023-12-03 11:49:00 26 4
gpt4 key购买 nike

数值字面量具有多态类型:

*Main> :t 3
3 :: (Num t) => t

但是,如果我将变量绑定(bind)到这样的文字,多态性就会丢失:
x = 3
...
*Main> :t x
x :: Integer

另一方面,如果我定义一个函数,它当然是多态的:
f x = 3
...
*Main> :t f
f :: (Num t1) => t -> t1

我可以提供一个类型签名来确保 x保持多态:
x :: Num a => a
x = 3
...
*Main> :t x
x :: (Num a) => a

但为什么这是必要的?为什么不推断多态类型?

最佳答案

这是monomorphism restriction它表示所有没有参数定义且没有显式类型注释的值都应该具有单态类型。可以使用 -XNoMonomorphismRestriction 在 ghc 和 ghci 中禁用此限制。 .

限制的原因是没有这个限制long_calculation 42将被评估两次,而大多数人可能期望/希望它只被评估一次:

longCalculation :: Num a => a -> a
longCalculation = ...

x = longCalculation 42

main = print $ x + x

关于haskell - 为什么在 Haskell 中没有推断出多态值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4179453/

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