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

时间:2018-09-28 03:34:41

标签: haskell higher-order-functions

我是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

我完全一无所知,请帮助我了解我在做什么错。

2 个答案:

答案 0 :(得分:3)

f中的参数mapThenComputeV1是您将要应用的函数。您正在传递接受两个参数的fn,但是mapThenComputeV1主体中有多余的括号。 试试这个:

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

但是我不确定这是否是您期望实现的目标。

答案 1 :(得分:1)

您的mapThenComputeV1的类型为(a -> b) -> (Int -> a) -> Int -> b(或类似名称)。

您尝试将其应用于fn times3 4

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

因此haskell尝试将mapThenComputeV1应用于fn,但是看到类型不匹配。 Int无法推断为(Int -> a)

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

PPS :如果您说明要使用mapThenComputeV1实现的目标,我们可以帮助您解决示例。