2012-08-22 129 views
1

我需要幫助理解Haskell表達式評估。舉例來說:瞭解Haskell表達式評估

group . sort $ [1,2,3] 

這是我對如何評估表達式的想法,我完全錯了嗎?
1。首先被評估,這產生了函數Ord a => [a] - > [[a]]
2. $被評估,這將評估$
的右側3. $的右側被作爲參數到$

左側的功能如何將空格(最高優先級?)與此綁定在一起?

+0

這裏沒有空格,無論如何都不是優先級。 –

+1

@Karolis,我認爲海報意味着功能應用程序。 –

+0

評估順序與'2 + 3 * 4'完全相同。 – sdcvvc

回答

8

表達式樹頂部有($)(group . sort)[1,2,3]作爲孩子。我可以看到這一點,因爲(.)具有9的更高的優先級#和優先級爲0更緊密地比($)結合:

Prelude> :i (.) 
(.) :: (b -> c) -> (a -> b) -> a -> c -- Defined in `GHC.Base' 
infixr 9 . 

Prelude> :i ($) 
($) :: (a -> b) -> a -> b -- Defined in `GHC.Base' 
infixr 0 $ 

(group . sort)具有(.)作爲頂部和groupsort作爲參數。 [1,2,3]脫糖至(1:(2:(3:([]))))。這是解析的表達式樹。

通過強制(group . sort)得到一個函數,然後將未評估爲通過此函數進行評估。

(group . sort)\xs -> group (sort xs)所以這成爲group (sort [1,2,3])group查看(sort [1,2,3])的最外部構造函數,其強制(sort [1,2,3])產生(1 : thunk),其中thunk最終將被評估爲[2,3]