[英]Function application in Haskell
好吧,這是漫長的一天,我的大腦可能無法在Haskell級別上運行,但我無法理解“了解你一個Haskell”中的一個例子。
該部分稱為帶有$的函數應用程序 ,並且有一個如何定義$
示例:
($) :: (a -> b) -> a -> b
f $ x = f x
到目前為止一切都很清楚。 我理解本節中的所有示例,除了最后一個:
ghci> map ($ 3) [(4+), (10*), (^2), sqrt]
[7.0,30.0,9.0,1.7320508075688772]
這里我們在函數列表中映射($ 3)
並將這些函數的應用結果發送到3
。 但這怎么可能呢?
從第一個代碼片段可以看出,第一個參數是一個函數,我們甚至可以寫:
*Main> ($) sqrt 4
2.0
現在($ 3)
是函數$
的部分應用,但是3
函數的位置! 所以3
應該是一個功能還是什么?
還有另一個謎團:到底是什么(4+)
? 我知道(+4)
是函數+
的部分應用,所以(4+)
應該部分應用函數4
? 廢話。 什么樣的伎倆在這里有效?
($ 3)
和(+ 4)
不是部分申請 - 他們是運營商部門。 部分應用程序看起來像(($) 3)
或((+) 4)
。
形式(? x)
的運算符部分(其中?
代表任意中綴運算符)綁定運算符的右操作數,即它等於\\y -> y ? x
\\y -> y ? x
。 同樣,運算符部分(x ?)
綁定左操作數,因此等效於部分應用程序。
我認為絆倒你的是操作員部分 。 這些允許您使用其中一個參數部分應用運算符,因此您可以使用運算符(+4)
和(4+)
,其中4
是第二個,然后是第一個參數分別為+
。 一個更清晰的例子可能是("Hello" ++)
與(++ "world")
,前者在字符串的前面加上"Hello"
,而后者將"world"
加到字符串的末尾。
這與使用前綴形式的運算符只是圍繞它的parens形成對比。 在這種形式中,以下內容是等效的:
> let join = (++)
> join "Hello, " "world"
"Hello, world"
> (++) "Hello, " "world"
"Hello, world"
在前綴形式中,您將運算符視為普通函數,並按順序接受其第一個和第二個參數。 在操作符部分中,操作參數的哪一側很重要。
所以在你的例子中,你有部分應用($ 3)
,你可以減少它
map ($ 3) [(4+), (10*), (^2), sqrt]
[($ 3) (4+), ($ 3) (10 *), ($ 3) (^ 2), ($ 3) sqrt]
[4 + 3, 10 * 3, 3 ^ 2, sqrt 3]
[7.0, 30.0, 9.0, 1.7320508075688772]
你對部分感到困惑。 掌握部分概念的好方法是玩一個例子:
(<^>) :: Int -> Float -> Int
a <^> b = a
上述函數是無用的函數,無論第二個參數是什么,它都返回第一個參數。 但它接受Int
,然后接受Float
作為輸入。
現在,因為部分你可以使用他們的任何一個參數:
λ> let a = (3 <^>)
λ> :t a
a :: Float -> Int
λ> let b = (<^> 3.0)
λ> :t b
b :: Int -> Int
了解a
和b
的類型因部分而異。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.