haskell - Haskell中翻转函数的定义
问题描述
目前我正在尝试通过“Learn You a Haskell”一书来学习 Haskell,并且我正在尝试了解第 5 章flip
中函数的实现。问题是作者说如果是有效的,那么也必须是真的。但是这种反转如何以及为什么会影响两个函数定义?g x y = f y x
f y x = g x y
我知道柯里化是如何工作的,而且我也知道->
默认情况下运算符是右关联的,因此类型声明实际上是相同的。我也了解彼此分开的功能,但不了解反转g x y = f y x
与此之间的关系。
第一次翻转功能
flip' :: (a -> b -> c) -> (b -> a -> c)
flip' f = g
where g x y = f y x
二次翻转功能
flip' :: (a -> b -> c) -> b -> a -> c
flip' f y x = f x y
解决方案
我认为作者头脑中的论点被疯狂地简化到甚至没有意义的地步。但这是我对推理的猜测。我们从第一个定义开始:
flip f = g where g x y = f y x
现在我们观察到这是一个 curried 的东西,我们使用所有关于(->)
和 junk 的关联性的讨论来写同样的东西,但是有两个额外的参数 to f
。像这样:
flip f x y = g x y where g x y = f y x
现在我们有了他所说的双向方程式:g x y = f y x
反之亦然。我们可以flip
使用这个等式重写主体,如下所示:
flip f x y = f y x where g x y = f y x
由于定义的主体不再提及g
,我们可以将其删除。
flip f x y = f y x
现在我们已经差不多了。在最终的定义中,作者在任何地方都互换了x
名称y
。我不知道他们为什么选择这样做,但这是你可以在等式推理中做出的合法举动,所以没有问题。这样做给了我们他们的最终等式:
flip f y x = f x y
推荐阅读
- dotnetnuke - 使用 2sxc 模块将 DNN 新闻导出到其他系统
- c# - 从一个文本框中的数据表值进行操作
- sql - 如何通过外部表解析 id
- json - 使用 System.Text.Json.JsonSerializer 反序列化到 ProblemDetails 时出错。.Net Core 3.0
- android - Unity GoogleMobileAdsMediationTestSuite 抛出异常 setAdListener 必须在主 UI 线程上调用
- google-bigquery - 我们可以将 BigQuery 中的数据导入 Google 表格吗?
- svg - 通过命令行的 Inkscape 和文档属性
- bash - 如何标记字符串并在bash中的每个标记上调用函数?
- vb.net - DatagridView 导出到 excel “只有 1 行正在导出”
- python - 从 Lambda 调用 DynamoDB BatchGetItem 具有 >1000 毫秒的延迟。正常吗?