gpt4 book ai didi

haskell - 为什么我得到 : Could not deduce (Fractional a) arising from a use of ‘/’ ?

转载 作者:行者123 更新时间:2023-12-01 08:21:32 27 4
gpt4 key购买 nike

我在 .hs 文件中有以下代码

module TypeInference1 where
f :: Num a => a -> a -> a
f x y = x + y + 3

然后,如果我检查 的类型f ,我得到以下结果,这是可以的:
*TypeInference1> :t f
f :: Num a => a -> a -> a

如果我传给 f 一个小数类型的参数并检查它的类型我得到:
*TypeInference1> :t f 1.0
f 1.0 :: Fractional a => a -> a

但另一方面,如果我更改 f 通过对其参数之一设置除法运算,如下所示: f x y = x/2 + y + 3
我收到以下错误:
5-typeInference1.hs:4:9: error:
• Could not deduce (Fractional a) arising from a use of ‘/’
from the context: Num a
bound by the type signature for:
f :: forall a. Num a => a -> a -> a
at 5-typeInference1.hs:3:1-25
Possible fix:
add (Fractional a) to the context of
the type signature for:
f :: forall a. Num a => a -> a -> a
• In the first argument of ‘(+)’, namely ‘x / 2’
In the first argument of ‘(+)’, namely ‘x / 2 + y’
In the expression: x / 2 + y + 3

为什么会发生这种情况,为什么我改变函数时不能推导出类型 f 如上?

最佳答案

简答 : 通过指定 Num a => a -> a -> a你声称f可以处理所有a s 是 Num 的成员类型类,但 (/)只能用于 Fractional 的成员类型类型类。

Fractional Num 的“子”类型类.这意味着作为 Fractional 成员的所有类型是 Num 的成员(member),但这不成立,反之亦然。

通过指定 f 的类型:

f :: Num a => a -> a -> a

你说 f可以处理所有类型 aNum 的成员类型类。但是如果你定义了 f 那是不正确的如 f x y = x/2 + y + 3 , 自 x/2意味着 x应该是 Fractional 的成员类型.确实 (/)有类型 (/) :: Fractional a => a -> a -> a .因此,您应该制作 f更具限制性,因此您只能传递类型为 a 的值。与 a Fractional成员(member)类型类:
f :: Fractional a => a -> a -> a
f x y = x/2 + y + 3

关于haskell - 为什么我得到 : Could not deduce (Fractional a) arising from a use of ‘/’ ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58217240/

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