首页 > 解决方案 > 两个函数之间的空格和使用组合运算符有什么区别?

问题描述

我试图定义一个函数来确定一个数字是否是 3 的倍数,我首先做了简单的案例

isMultipleOfThree num = (==0) (rem num 3)

但实际上即使在那种简单的情况下,我的第一个猜测是写我的解决方案

isMultipleOfThree num = (==0).(rem num 3)

返回错误

约束中的非类型变量参数:Integral (a -> b) (使用 FlexibleContexts 来允许这样做)当检查“isMultipleOfThree”是否具有推断类型时 isMultipleOfThree :: forall b a。(Eq b, Integral (a -> b), Num b) => (a -> b) -> a -> Bool

然后试图让它更“多态”:

正确答案如下,但我认为我应该使用空格而不是组合运算符......然后我只是“猜测”我会尝试使用组合运算符:

esMultiploDeTres = (==0).(flip (rem) 3)

所以我想我会补充我原来的问题:“两个函数之间的空格是什么?”

标签: haskellfunctional-programmingcomposition

解决方案


(.)被简单地定义为

# Apply g to x, then apply f to the result.
f . g = \x -> f (g x)

意思是

(f . g) x == f (g x)

并列代表功能应用,而.代表功能组合

高阶函数,例如(.),可以将其他函数作为参数,这意味着您可以将这样的函数应用于另一个函数。f . g是一个中缀表达式,相当于前缀表达式(.) f g,其中(.)应用于f,结果应用于g


推荐阅读