是否有 pretty/glib 方法可以将 curry 函数限制为 Haskell 中另一个函数的图形?

Is there a pretty/glib way to restrict a curry-ed function to the graph of another function in Haskell?

我终于厌倦了隔离,今天开始学习 Haskell,我真的很享受,我真的很喜欢这门语言的美感。希望这个问题不会激起任何仇恨,如果它之前已经在这里发布等等。这很简单,但我是一个绝对的初学者。

我一直在尝试了解如何使用语言优雅地(或至少以所谓的 "point free" 方式)做一些简单的事情,并遇到了如何以简洁的方式描述的问题采取两个变量的函数并将其限制为两个变量之间的函数图的过程。例如。如何取两个相同类型的变量的函数并沿对角线限制它以获得具有相同类型和相同类型输出的一个变量的函数,或任何类似的问题(有点像尝试在错误的一边柯里化的家庭,如果你喜欢的话)。

我今天一直在用简洁的方法来解决这个问题,但最终放弃并实现了以下供以后使用:

compFtn :: (a -> b -> c) -> (a -> b) -> a -> c

compFtn f g a = f a (g(a)) 

它做我想做的事(比如说,去加里化 f 并以一种非常丑陋的方式做这件事)。然而,我觉得必须有更多 "point free"/doctrinaire 解决方案来解决这个非常基本的操作,所以我在这里四处询问,向大家学习一些风格。干杯。

函数是一个函子、一个应用程序和一个单子。我们可以将函数视为上下文,其中包含的值一旦应用就会显示出来。

因此对于函数类型 Functor 实例将是组合 (.) 运算符。为什么?假设我们有一个函数 (+1),它说当你应用我一个 Num a class 值时,我会将它递增 1。所以让我们实现 fmap.

fmap f g = f . g -- <$> == (.)

显然我们正在将 f 应用于 g 的 return 值。

那么我们怎样才能使一个函数成为 Applicative 的一个实例呢?它必须在其上下文中包含另一个函数。基本上它应该 return 应用时的功能。这至少意味着 (a -> b -> c)。所以给你。

(a -> b -> c) <*> (a -> b) 实际上一旦应用 a (a -> b -> c) 变为 (b -> c) 并且 (a -> b) 变为 b(b -> c)应用 b。所以是的,您正在寻找的是 <*> 运算符。