点(.)和美元符号($)的区别是什么?
根据我的理解,它们都是不需要使用括号的语法糖。
点(.)和美元符号($)的区别是什么?
根据我的理解,它们都是不需要使用括号的语法糖。
当前回答
学习任何东西(任何函数)的一个好方法是记住所有东西都是函数!一般的咒语是有帮助的,但在特定的情况下,比如运算符,它有助于记住这个小技巧:
:t (.)
(.) :: (b -> c) -> (a -> b) -> a -> c
and
:t ($)
($) :: (a -> b) -> a -> b
只需记住大量使用:t,并将操作符包装在()中!
其他回答
它们有不同的类型和不同的定义:
infixr 9 .
(.) :: (b -> c) -> (a -> b) -> (a -> c)
(f . g) x = f (g x)
infixr 0 $
($) :: (a -> b) -> a -> b
f $ x = f x
($)旨在取代普通的函数应用程序,但在不同的优先级,以帮助避免括号。(.)用于将两个函数组合在一起,生成一个新函数。
在某些情况下,它们是可以互换的,但在一般情况下并非如此。典型的例子是:
f $ g $ h $ x
==>
f . g . h $ x
换句话说,在$s链中,除了最后一个,其他的都可以被。
... 或者你可以避免。和$ structures使用管道:
third xs = xs |> tail |> tail |> head
这是在你添加了helper函数之后:
(|>) x y = y x
学习任何东西(任何函数)的一个好方法是记住所有东西都是函数!一般的咒语是有帮助的,但在特定的情况下,比如运算符,它有助于记住这个小技巧:
:t (.)
(.) :: (b -> c) -> (a -> b) -> a -> c
and
:t ($)
($) :: (a -> b) -> a -> b
只需记住大量使用:t,并将操作符包装在()中!
简短而甜蜜的版本:
($)调用作为其左实参的函数对作为其右实参的值进行调用。 (.)将作为其左参数的函数组合到作为其右参数的函数上。
一个很有用的应用程序,我花了一些时间从Learn You a Haskell非常简短的描述中弄清楚:Since
f $ x = f x
在包含中缀运算符的表达式的右边加圆括号将其转换为前缀函数,可以将($ 3)(4 +)写成类似于(++ ",world")“你好”。
为什么会有人这么做?例如,对于函数列表。两个:
map (++ ", world") ["hello", "goodbye"]
map ($ 3) [(4 +), (3 *)]
比
map (\x -> x ++ ", world") ["hello", "goodbye"]
map (\f -> f 3) [(4 +), (3 *)]
显然,后一种变体对大多数人来说更具可读性。