了解Haskell表达式评估

时间:2012-08-22 19:03:45

标签: haskell expression evaluation

我需要帮助理解Haskell表达式评估。举个例子:

group . sort $ [1,2,3]  

这是我对表达式如何评估的看法,我完全错了吗? 1。首先评估,这将创建函数Ord a => [a] - > [[一个]]
2. $被评估,这评估了$
的右侧 3. $的右侧作为参数提供给$

左侧的函数

空格(最高优先级?)如何与此相关?

1 个答案:

答案 0 :(得分: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)来获取函数,然后将[1,2,3]未评估的值传递给此函数来评估它。

(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]评估为{{1}}。