问题标签 [pointfree]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - 使 Haskell 函数无点
我是 Haskell 初学者,我一直在玩无点函数。我有两个函数的问题 - lambdabot 的解决方案绝对不可读并且使代码混淆,所以我在这里询问是否有办法简化函数。
第一个函数从列表中删除重复项。
我尝试制作这个函数的无点版本,foldr
但>>=
没有成功。
第二个函数将列表映射到包含原始元素的元组列表以及它们在列表中出现的频率。
哪里count a = length.filter(==a)
。我不确定是否可以在保持可读性的同时制作此功能的无点版本,但我想确定一下。
任何有关使这两个功能无点的帮助将不胜感激。
haskell - eta减少什么时候可以改变函数的类型?
以下到底是怎么回事?
我想知道我以前怎么没注意到这一点?我实际上遇到了“map fromIntegral”而不是 show 的问题——我的代码不能用无点形式编译,但在没有 eta 减少的情况下可以正常工作。
是否有一个简单的解释 eta 减少何时可以改变 Haskell 代码的含义?
haskell - 有没有更好的方法来用无点表示法表达绝对误差函数?
用有针对性的符号表示:
absoluteError x y = abs (x-y)
无点表示法中的一个不清楚的例子:
absoluteError' = curry (abs . uncurry (-))
haskell - 为什么将 sq 改为 point-free 会改变类型
可能重复:
这个 ghci 会话中的类型是怎么回事?
为了尝试练习一些haskell并了解无点,我正在玩一个对数字求平方的函数
所以我开始定义
所以我可以用 dup 重写 sq (现在不用担心让 dup 点免费)
并检查 sq 的类型,我看到了我期望看到的
所以我删除了x并得到
我错过了什么?
f# - 在 F# 中使用无点样式的非对称算子的偏函数应用?
如何为非对称运算符(例如模运算符)创建关于第一个参数的部分函数应用程序,而 F# 中没有任何参数名称?我的第一次尝试是
let mod10 = (%) 10
这当然转化为
mod10(x) = 10 mod x
而不是想要的
mod10(x) = x mod 10
. 我当然可以写
let mod10 x = (%)x 10
但我不想命名参数所以有一些可以使用的占位符,比如
let mod10 = (%)_ 10
?
haskell - Eta减少的理解
在weightDelta
函数上运行 hlint 时,会不断提示 Eta reduce。我阅读了另一个相关的 Eta reduce question,但我似乎无法将理解转移到这个案例中。
我试图“减少”它以指向自由语法的每一次更改都会破坏它。要在哪里进行更改,是否有任何直觉或技巧可以避免将来出现 eta reduce 建议?
haskell - 这个斐波那契函数是如何记忆的?
这个斐波那契函数是通过什么机制来记忆的?
在相关的说明中,为什么这个版本不是?
haskell - Haskell中的参数数量和无点
使用多个模式匹配,不同数量的参数是不可能的,即使是无点!
例如不起作用。但
做。有时我们只能在函数的一部分中使用无点,所以...
为什么?GHC太难了吗?:'(
haskell - 无点表示法、递归和模式匹配
所以我不断听到很多关于无点编程的信息,我决定做一个小实验来测试我对它的掌握程度。这涉及采用一个带尖的函数来计算一个数字的阶乘并将其转换为无点形式。我设法做到了,但是无点结果的可读性远低于有针对性的结果。
我是否遗漏了点自由符号所必需的东西,或者这是否像某些转换一样可读?对我来说,函数的很大一部分似乎fact
是零上的模式匹配,事实上,模式匹配是我喜欢 Haskell 的最大原因之一。然而,无点符号似乎完全不允许这样做,以及其他一些非常有用的东西,比如列表推导。
performance - 无点样式的性能影响
我在使用 F# 学习函数式编程方面迈出了第一步,我刚刚遇到了正向管道 (|>) 和正向组合 (>>) 运算符。起初我认为它们只是糖而不是对最终运行的代码产生影响(尽管我知道管道有助于类型推断)。
但是我遇到了这篇 SO 文章: 函数式编程中“无点”风格的优点和缺点是什么? 其中有两个有趣且内容丰富的答案(不是为我简化事情,而是打开了一整罐围绕“无意义”或“无意义”风格的蠕虫)我从这些(和其他阅读)中获得的收获是无意义的是一个有争议的领域。与lambas 一样,无点样式可以使代码更容易理解,或者更难理解,具体取决于使用情况。它可以帮助有意义地命名事物。
但我的问题涉及对第一个答案的评论:AshleyF 在答案中沉思:
“在我看来,组合可以通过让编译器更清楚地表明不需要像流水线一样产生中间值来降低 GC 压力;帮助使所谓的“森林砍伐”问题更容易解决。”
加舍 回复:
“关于改进编译的部分根本不是真的。在大多数语言中,无点风格实际上会降低性能。Haskell 严重依赖优化,正是因为它是使这些东西的成本可以承受的唯一方法。充其量,这些组合器被内联了,你得到一个等效的有意义的版本”</p>
任何人都可以扩展性能影响吗?(一般来说,特别是对于 F#)我刚刚假设它是一种写作风格的东西,编译器会将这两个习语解开成等效的代码。