说我有功能
g :: a -> b, h :: a -> c
and
f :: b -> c -> d.
函数可以写吗
f' :: a -> a -> d
给出的
f' x y = f (g x) (h y)
点自由风格?
可以写一个函数
f' a -> d, f' x = f (g x) (h x)
通过设置以点自由样式
f' = (f <$> g) <*> h
但我不知道如何处理更一般的情况。
We have:
k x y = (f (g x)) (h y)
我们希望写k
以无点风格。
第一个参数传递给k
is x
。我们需要做什么x
?好吧,首先我们需要调用g
在其上,然后f
,然后做一些奇特的事情来应用它(h y)
.
k = fancy . f . g
这是什么fancy
? Well:
k x y = (fancy . f . g) x y
= fancy (f (g x)) y
= f (g x) (h y)
所以我们渴望fancy z y = z (h y)
。减少 eta,我们得到fancy z = z . h
, or fancy = (. h)
.
k = (. h) . f . g
更自然的思考方式可能是
┌───┐ ┌───┐
x ───│ g │─── g x ───│ │
/ └───┘ │ │
(x, y) │ f │─── f (g x) (h y)
\ ┌───┐ │ │
y ───│ h │─── h y ───│ │
└───┘ └───┘
└──────────────────────────────┘
k
Enter Control.Arrow https://hackage.haskell.org/package/base-4.9.0.0/docs/Control-Arrow.html:
k = curry ((g *** h) >>> uncurry f)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)