2013-04-15 156 views
4
的高階函數subtract`的`

我想寫這個功能,在X應用功能f兩次現在行爲哈斯克爾

Prelude> applyTwice :: (a -> a) -> a -> a 
Prelude> let applyTwice f x = f (f x) 

,當我嘗試以下評價表達

Prelude> applyTwice (`subtract` 3) 10 
Output: 10 

Prelude> applyTwice (3 `subtract`) 10 
Output: 4 

根據我的理解,subtract是一箇中綴函數,所以給定的參數應該填充空位置(左或右操作數),因此第一個表達式applyTwice (`subtract` 3) 10應該像

10 `subtract` 3 `subtract` 3 

因此,結果在這種情況下應該是4,但輸出10

而在另一種情況下,即applyTwice (3 `subtract`) 10,輸出爲4,在那裏我期待它是10

我在哪裏錯了嗎?

+0

http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#v:subtract – Arjan

回答

6

您對applyTwice以及操作員部分符號的理解是正確的。但是,您可能會對subtract做什麼感到困惑。見the library documentation它說:

一樣flip (-)

所以subtract就像(-)但翻轉的參數。因此,

applyTwice (`subtract` 3) 10 
= 
    (`subtract` 3) ((`subtract` 3) 10) 
= 
    (`subtract` 3) (10 `subtract` 3) 
= 
    ((10 `subtract` 3) `subtract` 3) 
= 
    (3 - 10) `subtract` 3 
= 
    (-7) `subtract` 3 
= 
    3 - (-7) 
= 
    10 

和其他表達式類似。

+0

Aaan !!我正在從左操作數減去右操作數,這正好相反。感謝您解釋:) – Vivek