function - 请您向我解释一下高阶函数的柯里化是如何工作的,尤其是下面的示例
问题描述
有人可以帮我解决以下问题,
applyTwice :: (a -> a) -> a -> a
applyTwice f x = f (f x)
我不明白上述是如何工作的。如果我们有类似的东西(+3) 10
肯定会产生13
?那是怎么回事f (f x)
。基本上,在查看高阶函数时,我不理解柯里化。
所以我不明白的是,如果说我们有一个形式的函数,a -> a -> a
它将接受一个输入a
然后产生一个函数,该函数期望另一个输入 a 产生一个输出。因此,如果我们add 5 3
这样做add 5
,将产生一个函数,该函数期望输入3
产生最终输出8
。我的问题是这里是如何工作的。我们将一个函数作为输入,所以部分函数应用程序在这里是否像在其中一样工作,add x y
或者我是否完全过度复杂化了一切?
解决方案
那不是柯里化,那是部分应用。
> :t (+)
(+) :: Num a => a -> a -> a
> :t (+) 3
(+) 3 :: Num a => a -> a
部分应用程序(+) 3
确实产生了一个函数(+3)
(*),它等待另一个数字输入来产生它的结果。它会这样做,无论是一次还是两次。
您的示例扩展为
applyTwice (+3) 10 = (+3) ((+3) 10)
= (+3) (10+3)
= (10+3)+3
这里的所有都是它的。
(*)(实际上是(3 +)
,但(+ 3)
无论如何都一样)。
正如chepner在评论中澄清的那样(引用最少的复制编辑),
部分应用是由于函数只接受一个参数,以及函数应用的右结合性
(->)
和左结合性的结合而产生的一种错觉。(+) 3
并不是真正的部分应用程序。(+)
这只是对 a argument的 [常规] 应用3
。
因此,从其他更传统的语言的角度来看,我们将其称为柯里化和部分应用之间的区别。
但从 Haskell 的角度来看,这确实是关于柯里化,即一次将一个函数应用于其参数,直到其类型指示完全饱和(即a->a->a
应用于一个值的a
值变成一个a->a
值,然后再变成一个a
值当a
依次应用于一个值时)。
推荐阅读
- node.js - Node.js:SQLITE_ERROR:“$entry”附近:语法错误
- asp.net - .net core 2.1 从另一个位置重定向 cookie 值始终为空
- php - 无法在 Laravel Dusk 中截屏
- python - AttributeError:模块'pika'在rabbitmq中没有属性'BlockingConnection'错误
- deep-learning - 如何将 Torch 图像切片为 numpy 图像
- laravel - 在 Laravel 中基于令牌的身份验证中过期时间过后获取新令牌的问题
- javascript - 使用 window.innerWidth 和 window.innerHeight 使滚动条出现
- python - python3.x 使用 format() 打印列表的每个值
- node.js - 我们如何仅从 js 的新行中删除逗号
- python - PyTorch - 有效地应用注意力