haskell - 两个函数之间的空格和使用组合运算符有什么区别?
问题描述
我试图定义一个函数来确定一个数字是否是 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)
所以我想我会补充我原来的问题:“两个函数之间的空格是什么?”
解决方案
(.)
被简单地定义为
# 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
。
推荐阅读
- javascript - Webpack DevServer 太慢还是我做错了什么?
- azure-virtual-network - 限制特定用户对特定资源的点到站点 Azure VPN 访问
- json - 使用 JSR223 PreProcessor 在 Jmeter 中创建带有变量的数组 Json 对象(表单 csv)
- android - Android - 菜单项未显示在工具栏上
- python - 在 python 中使用 np.interp 在两个 1D 数组上进行插值:错误 ValueError: object of too small depth for desired array
- azure-functions - 有没有办法查看 Azure Functions 运行时在 Linux 中的更新时间?
- regex - 为什么我的正则表达式会随着更多的运营商而呈指数级增长?
- javascript - 如何让屏幕阅读器完成表列名的播报,暂停再播报列的补充信息?
- java - 为什么这个局部变量在 Java 中等于 null?
- google-apps-script - 根据用户输入搜索正确的范围