gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:41:25 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 是可能的”等?我见过 MulDivSum 类型类。但它们似乎没有告诉编译器任何有关对两种不同类型进行算术运算的信息。

如果您想知道,这对我来说很重要,因为我正在使用 Dimensional 包。确实可以对该包中的不同类型进行算术运算。例如,您可以调用 linearInterp,其中类型 aLength Float,类型 b速度 float .

最佳答案

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

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