Haskell 函数组合 (.) 与函数应用 ($)

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

我正在浏览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

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

最佳答案

它们不可互换。

你拥有的是

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

显然事实并非如此。

因此,在相同表达式中将 . 替换为 $ 会产生不同的结果,正如您所期望的那样。同时两个不同表达式碰巧产生相同的结果。这没什么奇怪的,表达式总是被简化为等价的不同表达式。

关于Haskell 函数组合 (.) 与函数应用 ($),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59503058/

相关文章:

c++ - 对动态数组使用重载的 << 运算符

c++ - C++ << 和 >> 运算符慢吗?这些运算符有哪些替代方案?

haskell - Haskell 的 "composing lenses using function composition"具有奇怪的参数顺序是如何实现的?

Haskell 因 runST 和 Data.Vector.Unboxed.Mutable 崩溃

haskell - 提前终止一元折叠

performance - coursera progfun1 : scala union performance

haskell - 这个语法在 Haskell 中是什么意思 : _|_ or (_|_)

string - Haskell 中任意长度的多个分隔符分割字符串

c - 有没有办法在 C 中进行柯里化(Currying)?

c# - VB.NET 与 C# 整数除法