我在理解函數應用程序如何在curk in haskell中工作時遇到問題。 如果我有以下功能:Haskell美元運算符應用程序
($) :: (a -> b) -> a -> b
據我所知,部分地應用此功能,我需要提供(a -> b)
功能($
的第一個參數)。
爲什麼然後有可能先應用一個值(即反向參數)?
($ 0) :: Num a => (a -> b) -> b
我在這裏錯過了什麼?
我在理解函數應用程序如何在curk in haskell中工作時遇到問題。 如果我有以下功能:Haskell美元運算符應用程序
($) :: (a -> b) -> a -> b
據我所知,部分地應用此功能,我需要提供(a -> b)
功能($
的第一個參數)。
爲什麼然後有可能先應用一個值(即反向參數)?
($ 0) :: Num a => (a -> b) -> b
我在這裏錯過了什麼?
($)
是運營商。在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)
≡(\x -> x $ 0)
≡(\x -> ($) x 0)
如果($) :: (a -> b) -> a -> b)
,我們採用第二個參數一樣(\x -> ($) x 0)
我們:: Num a => (a -> b) -> b
您正混淆操作符的中綴表示法和函數。
> :t (($) (+1))
(($) (+1)) :: Num b => b -> b
下面是一些形式的表達式與$
,爲了更好地理解:
一個$ B =>($)AB
($ B)=>翻轉($)b =>(\ BA - >($)AB)b => \一個 - >($)AB
(一個$)=>($)A => \乙 - >($)AB
-1即使有人堅信這個問題是關於什麼以及理由是什麼,我發現這個答案是不可理解的。那些不熟悉Haskell的人應該如何理解這一點?沒有解釋操作員和功能之間的區別。 '$ b => flip($)b => \ a - >($)a b'甚至不是有效的語法。 (編輯:好吧,如果我有更多的代表,它會是-1。) –
還要注意,在Haskell語法中,字母數字名稱與標點符號名稱不同。
默認情況下,字母數字函數foo1 a b
是前綴,如果添加反引號,則會成爲中綴:a `foo` b
。
標點符號命名的功能類似$
或<*>
默認情況下綴,如果您添加括號($)
或(<*>)
成爲前綴。這只是熟悉拉丁字母的程序員的語法糖;它是字母數字名稱和標點符號名稱之間的任意但有用的區別。
這兩種函數都只是函數,它們沒有C++或Java中「操作符」的特殊語義規則。它只是圍繞前綴/中綴和反引號/括號的語法規則,它們在標點名稱函數和字母數字命名函數之間不同。
謝謝,這解釋了它爲什麼這樣工作。這些定義是語言特性還是可以在源代碼中找到它們? – Rumca
@Rumca沒有真正的來源,(x $)和($ x)是章節,並且可以在[2010 haskell報告]中找到它們的描述(http://www.haskell.org/onlinereport/haskell2010/ )[部分](http://www.haskell.org/onlinereport/haskell2010/haskellch3.html#x8-300003.5)。 – Davorak
該語言在[Haskell 2010報告](http://www.haskell.org/onlinereport/haskell2010/)中描述。 –