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