我需要帮助理解 Haskell 表达式评估。举个例子:
group . sort $ [1,2,3]
这是我对如何评估表达式的想法,我完全错了吗?
1.. 首先被评估,这将创建函数 Ord a => [a] -> [[a]]
2. $ 被评估,这将评估 $
3 的右侧。 $ 的右侧作为参数提供给函数在 $ 的左侧
空格(最高优先级?)如何与这一切联系起来?
我需要帮助理解 Haskell 表达式评估。举个例子:
group . sort $ [1,2,3]
这是我对如何评估表达式的想法,我完全错了吗?
1.. 首先被评估,这将创建函数 Ord a => [a] -> [[a]]
2. $ 被评估,这将评估 $
3 的右侧。 $ 的右侧作为参数提供给函数在 $ 的左侧
空格(最高优先级?)如何与这一切联系起来?
表达式树($)
在顶部,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)
作为(.)
顶部group
和sort
作为参数。去[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]