haskell - 用无点样式写 f?

标签 haskell pointfree

说我有功能

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无点风格。

第一个参数传递给 kx .我们需要用 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/

相关文章:

javascript - 如何使用 Ramda 编写 point-free 函数式 JS

haskell - 将函数a→b用作 "monadic"函数a→m b

javascript - 如何在JS中演示简单的无点风格

haskell - Haskell 中的幻像类型

haskell - 包版本控制策略 - 无害的类型更改?

haskell - 如何使用 Haskell 超时函数(在 System.Timeout 中)来停止失控计算?

haskell - 有人可以提供执行以下计划的机器吗?

haskell - 组合函数组合 : How does (. ).(.) 有效吗?

haskell - 将两个 monadic 值成对并返回

Haskell cabal+hsc2hs