说我有功能
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 - 用无点样式写 f?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38743576/