11

我在理解函數應用程序如何在curk in haskell中工作時遇到問題。 如果我有以下功能:Haskell美元運算符應用程序

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

據我所知,部分地應用此功能,我需要提供(a -> b)功能($的第一個參數)。

爲什麼然後有可能先應用一個值(即反向參數)?

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

我在這裏錯過了什麼?

回答

13

($)是運營商。在Haskell中,任何操作員可以寫成左部分(如(x $))或右部分(如($ x)):

(x $) = (\y -> x $ y) = ($) x 
($ x) = (\y -> y $ x) = flip ($) x 

注意唯一的例外是(-),爲了方便寫負數:要簡潔地寫(\y -> y - x)

\x -> (x-) :: Num a => a -> a -> a -- equivalent to \x -> (-) x 
\x -> (-x) :: Num a => a -> a  -- equivalent to \x -> negate x 

在情況下,你可以使用subtract

\x -> subtract x :: Num a => a -> a -> a -- equivalent to \x -> flip (-) x 
+0

謝謝,這解釋了它爲什麼這樣工作。這些定義是語言特性還是可以在源代碼中找到它們? – Rumca

+2

@Rumca沒有真正的來源,(x $)和($ x)是章節,並且可以在[2010 haskell報告]中找到它們的描述(http://www.haskell.org/onlinereport/haskell2010/ )[部分](http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-300003.5)。 – Davorak

+0

該語言在[Haskell 2010報告](http://www.haskell.org/onlinereport/haskell2010/)中描述。 –

4

($ 0)(\x -> x $ 0)(\x -> ($) x 0)

如果($) :: (a -> b) -> a -> b),我們採用第二個參數一樣(\x -> ($) x 0)我們:: Num a => (a -> b) -> b

2

您正混淆操作符的中綴表示法和函數。

> :t (($) (+1)) 
(($) (+1)) :: Num b => b -> b 

下面是一些形式的表達式與$,爲了更好地理解:

一個$ B =>($)AB

($ B)=>翻轉($)b =>(\ BA - >($)AB)b => \一個 - >($)AB

(一個$)=>($)A => \乙 - >($)AB

+0

-1即使有人堅信這個問題是關於什麼以及理由是什麼,我發現這個答案是不可理解的。那些不熟悉Haskell的人應該如何理解這一點?沒有解釋操作員和功能之間的區別。 '$ b => flip($)b => \ a - >($)a b'甚至不是有效的語法。 (編輯:好吧,如果我有更多的代表,它會是-1。) –

1

還要注意,在Haskell語法中,字母數字名稱與標點符號名稱不同。

默認情況下,字母數字函數foo1 a b是前綴,如果添加反引號,則會成爲中綴:a `foo` b

標點符號命名的功能類似$<*>默認情況下綴,如果您添加括號($)(<*>)成爲前綴。這只是熟悉拉丁字母的程序員的語法糖;它是字母數字名稱和標點符號名稱之間的任意但有用的區別。

這兩種函數都只是函數,它們沒有C++或Java中「操作符」的特殊語義規則。它只是圍繞前綴/中綴和反引號/括號的語法規則,它們在標點名稱函數和字母數字命名函數之間不同。