gpt4 book ai didi

haskell - Pointfree 在 Haskell 中返回一个元组

转载 作者:行者123 更新时间:2023-12-02 02:49:24 25 4
gpt4 key购买 nike

pointfree 函数可以返回一个元组吗?例如,以下是否可以用 pointfree 风格编写(其中 f1、f2 和 f3 已被定义):

(\t -> (f1 t, f2 t, f3 t))

在这种情况下,我的 f1、f2 和 f3 是 quot、mod、* 和一些整数的组合。
(\f1,f2,f3 -> (\t -> (f1 t, f2 t, f3 t)))

是更一般的情况,等价于
(\f1,f2,f3,t -> (f1 t, f2 t, f3 t))

命名函数没问题,但我的例子是匿名的。 (命名示例如下)
f x = (f1 x, f2 x, f3 x)
f f1 f2 f3 x = (f1 x, f2 x, f3 x)

编辑:我只是为了好玩而好奇,我不会这样做。

最佳答案

你可以写

(\t -> (f1 t, f2 t, f3 t))

毫无意义,它是
liftM (,,) f1 `ap` f2 `ap` f3

ap来自 Control.MonadMonad (->) a 的实例来自 Control.Monad.Instances .更易读的形式可能是 Control.Applicative变体
(,,) <$> f1 <*> f2 <*> f3

然后你可以进一步点免
(\f1 f2 f3 -> (\t -> (f1 t, f2 t, f3 t)))

作为
  \f1 f2 f3 -> (,,) <$> f1 <*> f2 <*> f3
= \f1 f2 -> ((,,) <$> f1 <*> f2 <*>)
= \f1 f2 -> (<*>) ((,,) <$> f1 <*> f2)
= \f1 f2 -> ((<*>) . ((,,) <$> f1 <*>)) f2
= \f1 -> (<*>) . ((,,) <$> f1 <*>)
= \f1 -> (<*>) . (<*>) ((,,) <$> f1)
= \f1 -> (((<*>) .) . (<*>) . (<$>) (,,)) f1
= ((<*>) .) . (<*>) . (<$>) (,,)

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

关于haskell - Pointfree 在 Haskell 中返回一个元组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12395097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com