簡體   English   中英

Haskell中的函數應用程序

[英]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

了解ab的類型因部分而異。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM