我是函数式编程的学生,如果我的问题听起来很奇怪,很抱歉——我正试图围绕给定的函数类型签名以及它们是如何实现的。
查看ap
(替换)的签名
https://gist.github.com/Avaq/1f0636ec5c8d6aed2e45
(a → b → c) → (a → b) → a → c
在这里给出为
const S = f => g => x => f(x)(g(x));
我想我明白了。f
是一个接受两个参数,a
并b
返回的函数c
。g
是一个接受a
和返回的函数b
。所以g(a)
返回b
,因此f(a)(b)
可以写成f(a)(g(a))
,返回c
。
g(a)
是替代品b
吗?
好的,现在我正在研究一个仍然有意义的不同实现:
https://github.com/sanctuary-js/sanctuary-type-classes/tree/v7.1.1#ap--applyf--fa-bfa---fb
ap(Identity(Math.sqrt), Identity(64))
类型签名
(f (a -> b), f a) -> f b
看起来类似于
(a → b → c) → (a → b) → a → c
使用 a = f、b = a 和 c = b 重写第二个我得到
(f -> a -> b) -> (f -> a) -> f -> b
假设它ap
接受两个参数,其中第一个f
可能是一些包含函数a -> b
的函子,第二个可能是一些函f
子,其中包含a
返回一个函子,该函子将第一个函子的函数替换为给定的终点b
,然后函子包含a
.
好吧,退后一步,这两件事看起来有很大的不同,我无法理解他们如何以某种方式说同样的事情。
const S = f => g => x => f(x)(g(x))
ap(Identity(Math.sqrt), Identity(64))
根据我的理解,ap(F(g),F(a))
可以表达为F(a).map(g)
,我仍然很难等同于const S = f => g => x => f(x)(g(x))
。也许我误解了什么。
...也许我的误解与 的表达ap
以及它的相关性有关,f => g => x => f(x)(g(x))
因为我可以看到它们如何表达相同的签名,但我不认为它们是同一件事。
任何可以在这里提供一些认知帮助的人,我将不胜感激