gpt4 book ai didi

haskell - 约束: Two type variables can be used with an operator

转载 作者:行者123 更新时间:2023-12-02 21:39:07 25 4
gpt4 key购买 nike

我有以下函数可以成功编译并运行:

-- Linearly interpolates between two values. That is, it is a function which:
-- returns y1 when x = x1
-- returns y2 when x = x2
-- returns a value between y1 and y2 when x1 < x < x2
linearInterp x1 y1 x2 y2 x =
(x - x1) * slope + y1
where slope = (y2 - y1) / (x2 - x1)

我想给它一个类型签名:

linearInterp :: a -> b -> a -> b -> a -> b

但是,正如预期的那样,类型签名会导致编译错误。这是因为编译器无法确定是否可以对任意类型进行算术 ab 。例如。它不知道你可以除 b通过a ,正如我在 slope 的定义中所做的那样.

有没有办法编写类型约束来表示“a / b是可能的”、“a + b是可能的”等等?我见过Mul , Div ,和Sum类型类。但它们似乎没有告诉编译器有关对两种不同类型进行算术的任何信息。

如果您想知道,这对我来说很重要,因为我正在使用 Dimensional 包。确实可以对该包内的不同类型进行算术运算。例如,您可以调用 linearInterp在哪里输入 aLength Float并输入 bVelocity Float .

最佳答案

如果我将您的代码包装在维度 Prelude 的导入中:

import Prelude ()
import Numeric.Units.Dimensional
import Numeric.Units.Dimensional.Prelude

linearInterp x1 y1 x2 y2 x =
(x - x1) * slope + y1
where slope = (y2 - y1) / (x2 - x1)

我推断出这种类型:

linearInterp
:: (Fractional a, Mul d1 d' d, Div d d1 d') =>
Dimensional DQuantity d1 a
-> Dimensional DQuantity d a
-> Dimensional DQuantity d1 a
-> Dimensional DQuantity d a
-> Quantity d1 a
-> Quantity d a

如果您确实想要这种通用性,那么对于该函数来说,这似乎是一个相当合理的类型。

MulDivSum 类型类实际上告诉编译器对不同类型进行算术运算,因为它们是多参数类:它们每个都采用三个参数,分别代表左参数类型、右参数类型和结果类型。

关于haskell - 约束: Two type variables can be used with an operator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20751866/

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