【问题标题】:Haskell Function Composition (.) vs Function Application ($)Haskell 函数组合 (.) 与函数应用程序 ($)
【发布时间】:2019-12-27 15:50:37
【问题描述】:

我正在通过this source code学习。

在第 81 行,我看到以下代码:

MaybeT . fmap Just $ locked .= False

我对函数组合的使用感到困惑,所以我将它加载到我的repl中并用函数应用程序替换它

MaybeT $ fmap Just $ locked .= False

我很惊讶这两段代码给出了确切的结果。

Control.Monad.State.Class.MonadState Game m => MaybeT m ()

事实上,我可以理解函数应用程序($) 是如何产生这个结果的,但是我对函数组合(.) 是如何产生这个结果感到困惑。这两个函数的签名不同,我认为如果一个替换另一个,它们显然会产生不同的结果。

:t (.) :: (b -> c) -> (a -> b) -> a -> c
:t ($) :: (a -> b) -> a -> b

有人可以向我解释为什么($)(.) 在这种情况下可以互换。

【问题讨论】:

  • (a . b) $ ca $ (b $ c) 相同 - 或者没有明确的 $,这只是分组的语法糖:(a . b) c = a (b c)
  • 为什么我被否决了?
  • 我不是反对者,但($)(.) 是我们已经讨论过多次的话题。只提一个问题:stackoverflow.com/questions/3030675/…
  • 我在发帖前尝试搜索了一下,但没有看到。对不起,我错过了。乍一看,我仍然认为我的问题仍然相关,因为代码行涉及更多的复杂性和噪音。我更难归结为答案。此外,主题有点不同。另一篇文章对他们的工作方式并不感到困惑,只是更喜欢哪种风格。我的问题具体是它是如何工作的。但是,当然,感谢您的链接。我也会经历这些并寻找更多资源。

标签: haskell functional-programming operators operator-precedence function-composition


【解决方案1】:

. 的优先级高于$

> :info ($)
($) :: (a -> b) -> a -> b   -- Defined in ‘GHC.Base’
infixr 0 $
> :info (.)
(.) :: (b -> c) -> (a -> b) -> a -> c   -- Defined in ‘GHC.Base’
infixr 9 .

所以a $ b $ c $ da $ (b $ (c $ d)),但a . b . c $ d(a . (b . c)) $ d

【讨论】:

    【解决方案2】:

    它们不可互换。

    你拥有的是

    MaybeT . fmap Just $ locked
    MaybeT $ fmap Just $ locked        -- you had `dead` here
    

    但由于运算符优先级,它实际上被解析为

    (MaybeT . fmap Just) locked  -- and
     MaybeT $ fmap Just  locked
    

    .$ 在此处参与不同结构的表达式。可互换意味着您可以替换

    (MaybeT . fmap Just) locked  -- with
    (MaybeT $ fmap Just) locked
    

    显然情况并非如此。

    因此,在 same 表达式中将 . 替换为 $ 会产生不同的结果,正如您所期望的那样。同时,两个不同的表达式碰巧产生了相同的结果。一点都不奇怪,表达式一直被简化为等效的不同表达式。

    【讨论】:

    • 我看到我混淆了两行代码。感谢您指出了这一点。下班回家后我会再回顾一下。
    猜你喜欢
    • 2016-04-30
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-03
    • 1970-01-01
    • 2011-03-08
    相关资源
    最近更新 更多