2014-12-28 32 views
0

此代碼的工作:由於Haskell運算符的優先級,寫好這個/正確的方法?

40 * sum [1..10] 

此代碼不:

40 * sum $ map id [1..10] 

我現在明白這是因爲,這是分成(40 * sum) (map id [1..10])由於運算符優先級,而不是什麼,我認爲是應該的,這是(40 *) (sum (map id [1..10]))

除了使用括號之外,是否有正確的方式在Haskell中編寫它?

+0

只是用括號:'40 *(總和$ map id [1..10])' – ErikR

+0

您可以創建一個像'$'一樣的新操作符,但是其固定性高於'*'。我*真的*不會建議這一點,但。 –

回答

5

據我所知,沒有辦法正常寫這個表達式,而不使用括號,但我希望看到更多的東西一樣以下

(40 *) $ sum $ map id [1..10] 

40 * (sum $ map id [1..10]) 

(*) 40 $ sum $ map id [1..10] 

(40 *) . sum . map id $ [1..10] 

一個相反的

(40 *) (sum (map id [1..10])) 

你可以得到如果您將(*)替換爲某個功能而不是運營商,則在此特定表達式中刪除該替代:

mult :: Num a => a -> a -> a 
mult = (*) 

expr :: Int 
expr = mult 40 $ sum $ map id [1..10] 

但是,我不會過多擔心有一些括號,在這種情況下,擁有它們並不是一件大事。引入一個新名字只是爲了規避少量的正常語法會讓你的代碼更難閱讀和理解。

0

答案更接近原始的表達,40 * sum $ map id [1..10],是考慮(*)是一個函數的只是名字,使括號只是名稱的一部分,而不是分組符號,並重寫表達式爲:

(*) 40 . sum $ map id [1..10] 

這種方式也避免了優先級問題,它僅影響二進制函數(運算符)的中綴形式。

函數式編程鼓勵使用的組成與應用,使更多的「正確」的方式,因爲你所要求的,將是這樣微小的變化:

(*) 40 . sum . map id $ [1..10]