一个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)
与ap从Control.Monad和Monad实例(->) a从Control.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)
但说真的,你不应该.保持可读性,这意味着一点点自由是好的,但不要过度.
| 归档时间: |
|
| 查看次数: |
570 次 |
| 最近记录: |