在Haskell中,有没有一种巧妙/巧妙的方法将curry-ed函数限制为另一个函数的图形?
我终于厌倦了隔离,今天开始学习哈斯克尔,我真的很享受自己,我真的很喜欢语言的美学。希望这个问题不会激起任何仇恨,如果它已经在这里张贴过,等等。它非常简单,但我是一个绝对的初学者 我一直在试图理解如何用语言优雅地做一些简单的事情(或者至少是以所谓的“无点”的方式),并且遇到了一个问题,即如何以干净的方式描述获取两个变量的函数并将其限制在两个变量之间的函数图的过程。例如,如何获取两个相同类型变量的函数,并沿对角线限制它,以获得一个具有相同类型和相同类型输出的变量函数,或任何类似的问题(如果愿意,有点像尝试在hom的错误一侧进行curry) 今天,我在用一些简洁的方法来做这件事,但最终放弃并实现了以下内容供以后使用:在Haskell中,有没有一种巧妙/巧妙的方法将curry-ed函数限制为另一个函数的图形?,haskell,currying,pointfree,Haskell,Currying,Pointfree,我终于厌倦了隔离,今天开始学习哈斯克尔,我真的很享受自己,我真的很喜欢语言的美学。希望这个问题不会激起任何仇恨,如果它已经在这里张贴过,等等。它非常简单,但我是一个绝对的初学者 我一直在试图理解如何用语言优雅地做一些简单的事情(或者至少是以所谓的“无点”的方式),并且遇到了一个问题,即如何以干净的方式描述获取两个变量的函数并将其限制在两个变量之间的函数图的过程。例如,如何获取两个相同类型变量的函数,并沿对角线限制它,以获得一个具有相同类型和相同类型输出的变量函数,或任何类似的问题(如果愿意,有点
compFtn :: (a -> b -> c) -> (a -> b) -> a -> c
compFtn f g a = f a (g(a))
这正是我想要的(比如说,降低f并以一种非常丑陋的方式进行)。然而,我有一种感觉,对于这个非常基本的操作,必须有一种更“无点”/教条主义的解决方案,所以我在这里四处打听,向你们学习一些风格。干杯。函数是函子、应用程序和单子。我们可以把函数看作一个上下文,其中包含一个已被应用的值。 因此,对于函数类型,
函子
实例将是复合(.)
运算符。为什么?假设我们有一个函数(+1)
,它说当你给我应用一个numa
类值时,我会将它增加1。因此,让我们实现fmap
fmap f g = f . g -- <$> == (.)
fmap f g=f。g--==()
显然,我们将f
应用于g
的返回值
那么,我们如何使函数成为应用程序的实例呢?它必须在其上下文中包含另一个函数。基本上,应用时它应该返回一个函数。这意味着至少(a->b->c)
。好了,给你
(a->b->c)(a->b)
实际上是一旦a
被应用(a->b->c)
变成(b->c)
和(a->b)
变成b
,并且(b->c)
与b
一起应用。因此,是的,您正在寻找的是
运算符。您应该研究应用程序,尤其是
运算符。@Redu的建议实际上相当不错。如果你尝试的话,这将是一个头痛的问题,但这将是一个很好的锻炼。尽管如此,不要过于关注无点,haskell中的每个函数都可以用无点风格编写,而且大多数情况下它是完全模糊的。我想说,表达你的函数的一种优雅方式是comptFtn f g a=a`f`g a
或comptFtn f g a=f a$g a
也许可以试试代码复查堆栈交换站点?@MichaelLitchard我真的不知道协议是什么,我认为这是关于Haskell的一个相当普遍的概念性问题,我对任何特定的代码片段都没有任何疑问(我只包含了一些代码片段,以表明我考虑过这个问题,并且不是懒惰/不诚实)。我的问题似乎基本上与此相同,因此回过头来看,将其放在这里似乎是合理的,但可能标准已经演变。或者,我提到我想要一个“无点”方法的原因是,因为问题是关于态射的一个非常基本的回调操作,必须有一些纯粹在函数上定义的运算符,为这个问题提供“概念上正确”的解决方案。太好了!很抱歉,我花了一些时间来验证您的解决方案,因为我还没有读到Haskell中如何使用函子。但这似乎很有道理,我想我上面的函数实际上是一种特殊类型应用程序的操作符,正如你所说的。非常感谢你的帮助!这绝对是一个我缺乏哈斯克尔文化的问题。如果我希望了解应用程序在概念上试图实现的目标,我想我现在需要做大量的阅读/编码工作……应用程序可以让您在它们已经存在的上下文中应用函数。一个简单的例子是仅(+1)
。现在,(+1)
函数可能在monad(不确定结果的上下文)中。如果我们喜欢Just(+1)Just 10
,我们得到Just 11
,甚至没有从上下文中剥离函数。为什么这很重要?因为由于您可能(不确定结果)只有10个
可能是无
,这取决于它最初的计算方式(即计算失败,您得到的是无
),然后只是(+1)无
给您无
)这是一个很好的解释!非常感谢您的帮助,这一切在一天前看起来是如此不必要的不透明,但在阅读了一些api并亲自尝试了一些函子和应用程序之后,雾开始消散。