我需要帮助理解Haskell表达式评估。举例来说:了解Haskell表达式评估
group . sort $ [1,2,3]
这是我对如何评估表达式的想法,我完全错了吗?
1。首先被评估,这产生了函数Ord a => [a] - > [[a]]
2. $被评估,这将评估$
的右侧3. $的右侧被作为参数到$
左侧的功能如何将空格(最高优先级?)与此绑定在一起?
我需要帮助理解Haskell表达式评估。举例来说:了解Haskell表达式评估
group . sort $ [1,2,3]
这是我对如何评估表达式的想法,我完全错了吗?
1。首先被评估,这产生了函数Ord a => [a] - > [[a]]
2. $被评估,这将评估$
的右侧3. $的右侧被作为参数到$
左侧的功能如何将空格(最高优先级?)与此绑定在一起?
表达式树顶部有($)
,(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)
具有(.)
作为顶部和group
和sort
作为参数。 [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]
。
这里没有空格,无论如何都不是优先级。 –
@Karolis,我认为海报意味着功能应用程序。 –
评估顺序与'2 + 3 * 4'完全相同。 – sdcvvc