Haskell 的四則運算符可以寫成 curry形式冒签,做不全調(diào)用:
比如 + * / - 四個運算,調(diào)用時候需要加括號
Prelude> (+) 2 3
5
(2+) 表示一個函數(shù)將調(diào)用的參數(shù)加上2
Prelude> (2+) 3
5
乘法和加法完全一樣兰怠。
除法稍微不一樣,(/) 表示用 第一個參數(shù)除以第二個參數(shù)肤寝。
Prelude> (/) 6 3
2.0
(6/)為不全調(diào)用旋廷,返回一個函數(shù),該函數(shù)將用6來除以調(diào)用的參數(shù)得到結(jié)果狈网。
Prelude> (6/) 3
2.0
(/6)為不全調(diào)用,返回一個函數(shù)笨腥,該函數(shù)將調(diào)用的參數(shù)除以6拓哺,即相當(dāng)于除法函數(shù)缺了第一個參數(shù)調(diào)用。
Prelude> (/6) 3
0.5
減號函數(shù)調(diào)用的順序依然和前面一樣脖母,用3來減去2.
Prelude> (-) 3 2
1
(3-)為不全調(diào)用士鸥,返回一個函數(shù),該函數(shù)將3減去調(diào)用的參數(shù)得到結(jié)果谆级。
Prelude> (3-) 2
1
因為減號 (-)
同時也是負(fù)號烤礁,所以,如果要得到一個函數(shù)把參數(shù)減去3肥照,怎么辦脚仔?仿照除法寫成 (-3)
肯定不行,因為-3
就是一個數(shù)舆绎,不是一個函數(shù)鲤脏,所以得加括號,讓減號(-)
成為函數(shù):
Prelude> ((-) 3) 2
1
很明顯,這個結(jié)果是 用 3-2
得到的猎醇,而不是我們期望的 2-3
其實 (3-)
== ((-) 3)
這兩個函數(shù)是等價的窥突,因為 (-) 3
相當(dāng)于減號(-)函數(shù)的不全調(diào)用,再補全一個參數(shù)硫嘶,就相當(dāng)于 (-) 3 2
這樣的調(diào)用阻问,也即等價于: 3 - 2
所以要得到參數(shù)減3函數(shù)這樣做不行,一種辦法可以用flip函數(shù)來變換參數(shù)的位置:
Prelude> (flip (-) 3) 2
-1
還可以用Haskell提供的另外一個函數(shù) subtract :
Prelude> (subtract 3) 2
-1
subtract
函數(shù)和減號不同沦疾,subtract
是用第二個參數(shù)減去第一個參數(shù)称近,和 減號(-)
剛好相反。比如上面的曹鸠,(subtract n)
就剛好返回我們需要的函數(shù):將調(diào)用的參數(shù)減去 n 煌茬。
但如果寫成下面這樣:
Prelude> (`subtract` 3) 2
1
用中綴來調(diào)用,則得到和 ((-) 3)
或者說 (3-)
等價的函數(shù)彻桃,因為subtract
是用第二個參數(shù)減第一個參數(shù)坛善,所以:3 \
subtract` 2得到的結(jié)果應(yīng)該為 2-3,而
(`subtract` 3)` 缺了第一個參數(shù)邻眷。
Prelude> (3 `subtract`) 2
-1
如果寫成上面這樣眠屎,就相當(dāng)于缺了第二個參數(shù)調(diào)用,因為subtract函數(shù)是第二個參數(shù)減去第一個參數(shù)的肆饶,所以不應(yīng)該寫成中綴調(diào)用改衩,這樣徒增復(fù)雜度,而沒任何幫助驯镊,所以大部分情況下用不到這個subtract函數(shù)葫督,但做不全調(diào)用時候,可以用來生成讓參數(shù)減去n的函數(shù)即 (subtract n)
板惑。
如果要寫減去3的函數(shù)橄镜,其實可以轉(zhuǎn)換成 (+ (-3))
這樣就可以了
Prelude> map (+ (-3)) [1..3]
[-2,-1,0]
或者可以簡寫成: -3+
這樣就省略一個括號
Prelude> map (-3+) [1..3]
[-2,-1,0]
查詢一下加號和減號的類型:
Prelude> :type (+)
(+) :: Num a => a -> a -> a
Prelude> :type (-)
(-) :: Num a => a -> a -> a
可以看到,雖然減號(-)
同時也是一個一元運算符冯乘,但查詢到的結(jié)果其實是減法的函數(shù)洽胶,Haskell還有另外一個函數(shù):negate
用來把一個數(shù)取負(fù)數(shù):
Prelude> negate 3
-3
Prelude> negate (-3)
3
Prelude> :type negate
negate :: Num a => a -> a
這樣就減號一元運算符的狀態(tài)了,其實根本沒有什么運算符裆馒,函數(shù)式語言嗎姊氓?一切都是函數(shù)而已。