自定义高阶函数调用在约束错误中给出非类型变量参数



我是Haskell的新手,我试图弄清楚高阶函数的基础。所以我创建了这个例子

times3 x = x * 3
fn f x = f (x+3)
transform x = x+5
mapThenComputeV1 f f1 x = f (f1 (transform (x)))

拨打电话时

mapThenComputeV1 fn times3 4

我收到此异常

*Main> mapThenComputeV1 fn times3 4
<interactive>:2:1: error:
* Non type-variable argument in the constraint: Num (t1 -> t2)
(Use FlexibleContexts to permit this)
* When checking the inferred type
it :: forall t1 t2. (Num t1, Num (t1 -> t2)) => t1 -> t2

我完全没有头绪,请帮助我了解我做错了什么。

mapThenComputeV1中的参数f是您要应用的函数。您传递的fn接受两个参数,但正文中有额外的括号mapThenComputeV1。 试试这个:

mapThenComputeV1 f f1 x = f f1 (transform (x))
output> 36

但我不确定这是否是你期望实现的。

您的mapThenComputeV1具有类型(a -> b) -> (Int -> a) -> Int -> b(或类似的东西(。

您尝试将其应用于fn times3 4

fn :: (Int -> a) -> Int -> a

所以Haskell尝试将mapThenComputeV1应用于fn,但发现类型不匹配。Int无法推断出(Int -> a).

PS:尝试在定义中添加显式类型。它通常可以帮助我找到问题。

PPS:如果您解释您希望通过mapThenComputeV1实现的目标,我们可以帮助您修复示例。

最新更新