【发布时间】:2013-12-24 06:20:06
【问题描述】:
我有以下函数编译运行成功:
-- 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
但是,正如预期的那样,类型签名会导致编译错误。这是因为编译器无法确定是否可以使用任意类型 a 和 b 进行算术运算。例如。它不知道你可以将b 除以a,就像我在slope 的定义中所做的那样。
有没有办法编写类型约束说“a / b 是可能的”、“a + b 是可能的”等?我见过Mul、Div 和Sum 类型类。但它们似乎没有告诉编译器关于对两种不同类型进行算术运算的任何事情。
如果您想知道,这对我很重要,因为我使用的是 Dimensional 包。确实可以对该包中的不同类型进行算术运算。例如,您可以调用linearInterp,其中a 类型为Length Float,b 类型为Velocity Float。
【问题讨论】:
-
linearInterp 推断出什么类型?您可以在 ghci 中使用 :t 或在 ghc 中使用 -fwarn-missing-signatures 进行检查。
-
其实是我自己做的——请看下面我的回答。
标签: haskell functional-programming