哈斯克尔"Non type-variable argument in the constraint"



我已经在我的repl中创建了一个部分应用功能的列表:

listOfPartiallyAppliedFunctions = map (*) [1..100]

然后,我想创建完成功能应用程序的结果列表,我可以通过向地图功能提供lambda来轻松地做到这一点:

let results = map (x -> x 4) listOfPartiallyAppliedFunctions

基本上是指在部分应用函数列表上映射应用于4的函数,其中x每个X均从列表中分别应用函数。

但是,我认为我可以写的是:

let results = map (4) listOfPartiallyAppliedFunctions

由于不需要为地图函数提供lambda,因此应该知道将4应用于listOfPartiallyAppliedFunctions中包含的部分应用功能。

但是,我遇到了这个错误:

• Non type-variable argument in the constraint: Num ((a -> a) -> b)
  (Use FlexibleContexts to permit this)
• When checking the inferred type
    it :: forall a b. (Num a, Num ((a -> a) -> b), Enum a) => [b]

有人可以帮助我解析此错误吗?我以为4是类型构造函数的实例?

但是,我认为我可以写的是:

let results = map (4) listOfPartiallyAppliedFunctions

否,如果您将执行x -> 4 x,则可以用4替换它。但是,由于4意味着它是Num实例,并且您可能没有使函数a -> b成为Num的实例,因此编译器无法解决此问题。因此,编译器说,它找不到将数字4转换为函数的方法,绝对不是将函数作为函数Num a => a -> a的函数,然后将其转换为b

但是,您可以将上述文字写为:

let results = map ($ 4) listOfPartiallyAppliedFunctions

在这里,我们在 ($) :: (a -> b) -> a -> b function上执行Infix Operator [Haskell-Wiki]的分段。

操作员部分的三个"定律"是

(a `op` b)  =  (a `op`) b  =  (`op` b) a  =  op a b

(丢失的参数进入操作员附近的自由插槽(,

或使用$

a b  =  (a $ b)  =  (a $) b  =  ($ b) a  =  ($) a b

因此

( x -> x 4) = ( x -> x $ 4) = ( x -> ($ 4) x)

,通过减少eta-reduction是

($ 4) 

相关内容

最新更新