gpt4 book ai didi

haskell - 为什么 Haskell 会(显然)不一致地推断出特定类型?

转载 作者:行者123 更新时间:2023-12-02 10:13:26 26 4
gpt4 key购买 nike

我正在编写一个玩具(物理)矢量库,并且遇到了 GHC 坚持认为函数应该具有 Integer 的问题。是他们的类型。我希望向量乘以向量以及标量(仅使用 * ),虽然这可以通过仅使用 Vector 来实现。实例Num我现在遇到了这样的错误:

Couldn't match expected type `Integer' with actual type `Double'

为了确定问题而研究了代码之后,我将其归结为:

data V a = V a a a deriving (Show, Eq, Functor)
scale a (V i j k) = V (a*i) (a*j) (a*k)
(<.>) = scale

现在,如果我们问 GHCi,我们会得到什么类型:

>:t scale
scale :: Num a => a -> V a -> V a
>:t (<.>)
(<.>) :: Integer -> V Integer -> V Integer

我们当然不想要<.>仅作用于Integer s。虽然这里可以通过包含 <.> 的类型签名来修复此问题。 ,我想知道到底发生了什么。

最佳答案

您遇到了臭名昭著的 monomorphism restriction 。另一种解决方案是显式指定参数:

a <.> v = scale a v

或添加-XNoMonomorphismRestriction pragma。

关于haskell - 为什么 Haskell 会(显然)不一致地推断出特定类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10117965/

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