说我有函数

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 . hfancy = (. 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/

10-11 02:35