【问题标题】:Is '$' a function in haskell? [duplicate]'$' 是 haskell 中的函数吗? [复制]
【发布时间】:2016-11-27 01:14:24
【问题描述】:

我对 haskell 中的 ($) 感到很困惑。

当我输入时

:t ($)

在 ghci 中。我会得到

:($) :: (a -> b) -> a -> b

但是,当我输入

:t ($ 3)

我会得到

($ 3) :: Num a => (a -> b) -> b

那么,为什么 ($) 接受第二个参数没有任何错误?

【问题讨论】:

  • ($) 函数确实是一个普通的 Haskell 函数,但它也是一个中缀运算符,所有名称完全是符号的函数也是如此。中缀运算符具有称为 运算符部分 的特殊部分应用语法,您可以在此处阅读有关它们的更多信息:wiki.haskell.org/Section_of_an_infix_operator
  • @Alexis King, not so ordinary.
  • @user3237465 我其实很清楚这一点,是的,但是把它带给学习者只会造成完全不必要的混乱。

标签: haskell syntax dollar-sign


【解决方案1】:

($) 是一个运算符,它是一个中缀函数。它的定义非常简单(事实上,唯一让它变得有趣的是它的固定性,我相信谷歌有大量的资源):

($) :: (a -> b) -> a -> b
f $ x = f x

像所有运算符一样,您可以通过仅应用第一个或仅应用第二个参数来获取sections。加上 (+) 运算符可能会更明显:

(+ 2) -- equivalent to \x -> x + 2
(2 +) -- equivalent to \x -> 2 + x

同样适用于($ 3) - 它等同于\f -> f $ 3。那么这个函数的类型应该很清楚了:它的参数f本身必须是一个接受数字并返回其他东西的函数(f :: Num a => a -> b),并且整个函数返回的类型与f返回的类型相同.这给了

(\f -> f $ 3) :: Num a => (a -> b) -> b

因此($ 3) :: Num a => (a -> b) -> b

【讨论】:

  • 如果 (3 $) 那么会是什么情况呢?我认为它不会产生任何结果。与 map (3$) [\x->x+10] 一起使用,对吗?
  • (3 $) 不会进行类型检查。 $ 期望它的第一个参数是一个函数。
猜你喜欢
  • 2018-04-30
  • 1970-01-01
  • 2013-03-24
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 1970-01-01
  • 2011-09-25
相关资源
最近更新 更多