我已经在我的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)