($)是(.)as`fmap`是?

Joh*_*ler 1 haskell functor pointfree

我有一个功能 funcM :: a -> b -> c -> IO (x, y)

我想编写一个函数funcM_ :: a-> b-> c-> IO x:

funcM_ = fst `fmap` funcM -- error
Run Code Online (Sandbox Code Playgroud)

我可以添加所有的点,但似乎应该有一些我可以替换的东西fmap,以便上述工作.有点像用(.)替换($)会使这个工作在纯粹的上下文中.

我在寻找什么功能?

Jon*_*rdy 8

由于您使用fmap三参数函数(funcM)组成单参数函数(),因此需要三个组合级别:

funcM_ = ((fmap fst .) .) . funcM
Run Code Online (Sandbox Code Playgroud)

这通过简单的扩展等同于尖头版本:

funcM_ x = (fmap fst .) . funcM x
funcM_ x y = fmap fst . funcM x y
funcM_ x y z = fmap fst (funcM x y z)
Run Code Online (Sandbox Code Playgroud)

这是从以下类型fmap:

fmap :: (Functor f) => (a -> b) -> f a -> f b
Run Code Online (Sandbox Code Playgroud)

你只是部分地应用了这些参数,funcM以便你有一个f a(这里IO (x, y))你给予fmap fst回来一个f b(IO x).

除此之外,M_通常意味着回归m ().