2012-08-22 76 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]