Pointfree在Haskell中返回一个元组

And*_*ott 3 haskell pointfree

一个pointfree函数可以返回一个元组吗?例如,以下内容可以用无点样式编写(其中f1,f2和f3已定义):

(\t -> (f1 t, f2 t, f3 t))
Run Code Online (Sandbox Code Playgroud)

在这种情况下,我的f1,f2和f3是quot,mod,*和一些整数的组合.

(\f1,f2,f3 -> (\t -> (f1 t, f2 t, f3 t)))
Run Code Online (Sandbox Code Playgroud)

是一个更普遍的情况,相当于

(\f1,f2,f3,t -> (f1 t, f2 t, f3 t))
Run Code Online (Sandbox Code Playgroud)

命名函数没问题,但我的例子是匿名的.(命名示例如下)

f x = (f1 x, f2 x, f3 x)
f f1 f2 f3 x = (f1 x, f2 x, f3 x)
Run Code Online (Sandbox Code Playgroud)

编辑:我只是好奇好玩,我不打算这样做.

Dan*_*her 11

你可以写

(\t -> (f1 t, f2 t, f3 t))
Run Code Online (Sandbox Code Playgroud)

没问题,是的

liftM (,,) f1 `ap` f2 `ap` f3
Run Code Online (Sandbox Code Playgroud)

apControl.MonadMonad实例(->) aControl.Monad.Instances.一种更易读的形式可能是Control.Applicative变体

(,,) <$> f1 <*> f2 <*> f3
Run Code Online (Sandbox Code Playgroud)

然后你可以进一步免费

(\f1 f2 f3 -> (\t -> (f1 t, f2 t, f3 t)))
Run Code Online (Sandbox Code Playgroud)

  \f1 f2 f3 -> (,,) <$> f1 <*> f2 <*> f3
= \f1 f2 -> ((,,) <$> f1 <*> f2 <*>)
= \f1 f2 -> (<*>) ((,,) <$> f1 <*> f2)
= \f1 f2 -> ((<*>) . ((,,) <$> f1 <*>)) f2
= \f1 -> (<*>) . ((,,) <$> f1 <*>)
= \f1 -> (<*>) . (<*>) ((,,) <$> f1)
= \f1 -> (((<*>) .) . (<*>) . (<$>) (,,)) f1
= ((<*>) .) . (<*>) . (<$>) (,,)
Run Code Online (Sandbox Code Playgroud)

但说真的,你不应该.保持可读性,这意味着一点点自由是好的,但不要过度.