具有任意数量参数的函数需要什么条件才能被重构为无点的?查看函数的有意义的表示并确定是否可以将其重构为无点是不是很简单?
我认为这些条件在某种程度上与语言无关,但如果不是,我特别想知道 Haskell。
我目前的思维过程是,鉴于每个参数仅被引用一次,并且您能够重新排列函数接受其参数的顺序,这意味着您应该能够将每个参数重构到函数的末尾。功能一一实现,但我不知道如何证明这一点,除了直觉,这意味着我可能是错的。此外,在某些情况下,多个引用参数的函数可以重构为无点的,例如
myFunc x = 2*x + x*x
可以变成 myFunc = uncurry (+) . ((2*) &&& (^2))
,所以即使我的想法是正确的,它也不会包含所有内容。
作为免责声明,我对 Haskell 和函数式编程还很陌生。
这总是可能的。从 lambda 演算到 SKI 组合器演算 有一个通用的翻译。请参阅维基百科上的组合逻辑:SK 基础的完整性。
Haskell 包pointfree 实现了这样的转换。它也可以作为在线工具pointfree.io。
总是可以以无点形式编写函数。如果问题不太适合 pointfree 风格,结果可能不太可读。
执行此操作的通用过程称为“抽象消除”算法,它对应于任何 lambda 项都可以转换为无点组合器演算(如 SKI)的证明。 pointfree.io 使用了这样的算法。自动翻译使用 (<*>)
(S)、
const
/pure
(K) 和 id
(I),以及其他组合符,例如 (.)
/fmap
(B) 和 flip
(C) 尽量使结果更加紧凑。不幸的是,它没有使用 Control.Arrow
中的数据流运算符,但这些对于在手动编写 pointfree 代码时获得更具可读性的结果非常有帮助。在 Haskell 中,你还需要意识到变量对求值顺序(模式匹配)和共享(重用变量)都有影响——也就是说,要翻译“依赖于”变量的语言功能,你可以需要编写更多辅助组合器才能获得完全相同的操作。