有没有办法在Haskell中预测部分应用函数的中缀函数行为?

Han*_*lla 0 syntax haskell currying partial-application

我有两个功能 -

partialSubtractionWith5 :: (Num a) => a -> a
partialSubtractionWith5 = (subtract 5)
Run Code Online (Sandbox Code Playgroud)

partialSubtractionWith5' :: (Num a) => a-> a
partialSubtractionwith5' = (`subtract` 5)
Run Code Online (Sandbox Code Playgroud)

调用partialSubtractionWith5 x返回相当于x - 5,而调用partialSubtractionWith5' x返回相当于5 - x.

Learn You a Haskell中,Lipovača定义了以下功能 -

isUpperAlphanum :: Char -> Bool
isUpperAlphanum = (`elem` ['A'..'B'])
Run Code Online (Sandbox Code Playgroud)

其中(基于我的实验subtract)我会认为当被称为时会表现得如此isUpperAlphanum 'some char':

Prelude> ['A'..'B'] `elem` 'some char'
False
Run Code Online (Sandbox Code Playgroud)

显然,事实并非如此.但为什么?有没有办法预测哪些函数在部分应用时会反转它们的参数?

lef*_*out 8

没有矛盾,就是这样subtract = flip (-).即

partialSubtractionWith5' x ? (`subtract` 5) x
                           ? x `subtract` 5
                           ? 5 - x
Run Code Online (Sandbox Code Playgroud)

同样地,

isUpperAlphanum '?' ? '?' `elem` ['A'..'B']
Run Code Online (Sandbox Code Playgroud)

OTOH,

partialSubtractionWith5 x ? (subtract 5) x
                          ? (5`subtract`) x
                          ? 5 `subtract` x
                          ? x - 5
Run Code Online (Sandbox Code Playgroud)