Haskell 中缀函数求值$
$是具有最低优先级的中缀运算符: f$a=f$a 这不意味着,在下面的表达式中 $2^2 是否应先评估,然后添加$2?似乎2+2是首先计算的 序曲>(2^)$2+2 返回: 十六,Haskell 中缀函数求值$,haskell,Haskell,$是具有最低优先级的中缀运算符: f$a=f$a 这不意味着,在下面的表达式中 $2^2 是否应先评估,然后添加$2?似乎2+2是首先计算的 序曲>(2^)$2+2 返回: 十六, 优先规则可能会令人困惑,但我喜欢将其视为“较低优先级别”的意思是“以后再做”。由于$的优先级最低(例如,低于(+)),因此它在(+)之后执行。因此,(2^)$2+2计算(2^)到一个部分应用的函数,然后计算2+2到4,然后将4到2^得到16优先级规则可能会令人困惑,但我喜欢将其视为“较低优先级”的意思是“以后做”。由
优先规则可能会令人困惑,但我喜欢将其视为“较低优先级别”的意思是“以后再做”。由于
$
的优先级最低(例如,低于(+)
),因此它在(+)
之后执行。因此,(2^)$2+2
计算(2^)
到一个部分应用的函数,然后计算2+2
到4
,然后将4
到2^
得到16
优先级规则可能会令人困惑,但我喜欢将其视为“较低优先级”的意思是“以后做”。由于$
的优先级最低(例如,低于(+)
),因此它在(+)
之后执行。因此,(2^)$2+2
计算(2^)
到一个部分应用的函数,然后计算2+2
到4
,然后应用4
到2^
得到16
否。试着把优先考虑的问题不在于“先计算”什么,而在于插入括号的位置
$
具有最低优先级这一事实意味着括号将插入到它右边的所有内容周围(如果需要,可以单独插入到它的左边,但这里不需要)。所以
(二)2元加2元
相当于
(二)$(二加二)
当然是这样
(2^)4(即16)
不可以。试着把优先考虑的不是“首先计算”的内容,而是插入括号的位置
$
具有最低优先级这一事实意味着括号将插入到它右边的所有内容周围(如果需要,可以单独插入到它的左边,但这里不需要)。所以
(二)2元加2元
相当于
(二)$(二加二)
当然是这样
(2^)4(即16)
所以haskell从右到左求值,就像在添加括号时,所有术语都具有相同的优先级一样?实际上,它比这要复杂一点:它总是尝试先求值“最外层”的函数/运算符,然后求值它需要求值的任何项。因此,它将首先尝试计算
$
,因为这不在所有括号内,但要这样做,它需要计算应用于(2+2)
的;为了评估它必须计算出2+2
,所以在实践中,这是第一个执行的数值运算,但这并不是因为它是从右到左的。所以haskell从右到左求值,就像添加括号时,所有术语都具有相同的优先级一样?事实上,这比这要复杂一点:它总是首先尝试求值“最外层”的函数/运算符,然后求值它需要求值的任何东西。因此,它将首先尝试计算$
,因为这不在所有括号内,但要这样做,它需要计算应用于(2+2)
的;为了评估它必须计算出2+2
,所以在实践中,这是第一个执行的数值运算,但这并不是因为它是从右向左的。我倾向于混淆“低”和“高”优先级的含义;这有助于我将$
看作是非常松散的绑定,并且&
绑定比|
更紧密;这有助于我将$
看作是非常松散的绑定,&&
绑定比|
更紧密。