1

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

group . sort $ [1,2,3]  

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

空格(最高优先级?)如何与这一切联系起来?

4

1 回答 1

8

表达式树($)在顶部,with(group . sort)[1,2,3]as children。我可以看到这一点,因为(.)它的优先级为 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]

于 2012-08-22T20:02:53.683 回答