说我有函数
g :: a -> b, h :: a -> c
和
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
但我无法弄清楚如何做更一般的情况。
最佳答案
我们有:
k x y = (f (g x)) (h y)
我们希望以无点风格编写
k
。传递给
k
的第一个参数是 x
。我们需要用 x
做什么?好吧,首先我们需要在它上面调用 g
,然后是 f
,然后做一些有趣的事情来将它应用到 (h y)
。k = fancy . f . g
这是什么
fancy
?出色地: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
或fancy = (. h)
。k = (. h) . f . g
一种更自然的思考方式可能是
┌───┐ ┌───┐
x ───│ g │─── g x ───│ │
/ └───┘ │ │
(x, y) │ f │─── f (g x) (h y)
\ ┌───┐ │ │
y ───│ h │─── h y ───│ │
└───┘ └───┘
└──────────────────────────────┘
k
输入
Control.Arrow
:k = curry ((g *** h) >>> uncurry f)
关于haskell - 用pointfree风格写f?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38743576/