我今天终于在隔离区无聊到开始学习Haskell了,我真的很喜欢,我真的很喜欢这门语言的美学。如果之前已经在这里发过了,希望这个问题不会激起大家的仇恨等等。很简单,但我是个绝对的初学者。
我一直想了解如何用语言优雅地做一些简单的事情(或者至少以所谓的 "无点 "方式),并遇到了一个问题,即如何以一种简洁的方式描述取两个变量的函数并将其限制在两个变量之间的函数图的过程。例如,如何将两个同类型变量的函数沿对角线进行限制,得到一个同类型和同类型输出的一个变量的函数,或者任何类似的问题(如果你喜欢的话,有点像在hom的错误一侧尝试咖喱)。
我今天在想简明扼要的方法,但最终还是放弃了,实现了下面的方法,供以后使用。
compFtn :: (a -> b -> c) -> (a -> b) -> a -> c
compFtn f g a = f a (g(a))
它能达到我想要的效果 (就像,说,decurrying f和以一种非常丑陋的方式做这件事一样)。不过我感觉这个很基本的操作一定有更 "无点 "学说的办法,所以我在这里向大家请教,向大家学习一些风格。干杯。
一个函数是一个漏子,一个应用性和一个单体。我们可以把函数看成是一个上下文,一旦应用就会显现出一个包含的值。
所以对于一个函数类型 Functor
例子将是组成 (.)
运营商。为什么这么说呢?假设我们有一个函数 (+1)
它说,当你给我申请一个 Num a
所以,让我们来实现 fmap
.
fmap f g = f . g -- <$> == (.)
显然,我们正在申请 f
的返回值。g
.
那么我们怎样才能使一个函数成为Applicative的实例呢?它必须在其上下文中包含另一个函数。基本上,它应该在应用时返回一个函数。这意味着 (a -> b -> c)
至少是这样 所以在这里,你。
(a -> b -> c) <*> (a -> b)
其实是曾经 a
适用于 (a -> b -> c)
成为 (b -> c)
和 (a -> b)
成为 b
和 (b -> c)
被应用与 b
. 所以是的,你要找的是 <*>
运营商。