2016-05-03 2 views
0

Для функции, которая использует тот же самый операнд, например. + или * несколько раз, как он оценит его?Какой порядок Haskell оценил бы 2 операнда одинакового приоритета?

Например, в следующем коде:

prodOfThree :: Int -> Int -> Int 
prodOfThree a b c = a*b*c 

Как бы следующее оценивать?

prodOfThree (2+3) 4 2 

Это, насколько я получил:

=> (2 + 3) * 4 * 2 
=> 5 * 4 * 2 

И тогда я уверен в том, будет ли умножать 5*4 первый, 4*2 первый или 5*4*2 все сразу.

+3

Не забывайте, что оптимизирующий компилятор может выбрать любой порядок оценки для ассоциативного оператора, такого как '*'. Дальше 'f 1 * f 2 * f 3' может выполнять все три вызова' f' сначала (в любом порядке), а затем выполнять умножения (в любом порядке) или смешивать как-то: приоритет не связан с порядком оценки аргументов. (Хотя, конечно, необходимо учитывать причинность данных) – chi

ответ

3

Вы можете попросить infixity использованием GHCI эксплуатанта:

>>> :info (*) 
class Num a where 
    ... 
    (*) :: a -> a -> a 
    ... 
     -- Defined in `GHC.Num' 
infixl 7 * 

Или вы можете look it up on Hackage. Хороший способ поиска Hackage - Hoogle или Hayoo.

Поскольку * имеет infixity infixl 7 это означает, что левоассоциативной и имеет приоритет . Поэтому a * b * c - (a * b) * c.

Более интересным примером является оператор, который не имеет математического свойства ассоциативности, такого как - (его нельзя путать с неуязвимостью, которое у него есть). Недостатком является infixl 6, и поэтому a - b - c - (a - b) - c.

Пример правого ассоциативной оператора ::

>>> :info (:) 
data [] a = ... | a : [a]  -- Defined in `GHC.Types' 
infixr 5 : 

Так a : b : c является a : (b : c). Обратите внимание, что если он был лево-ассоциативным, то a : b : c был бы (вероятно) ошибкой типа!

+0

А гениальный. Спасибо. Я специально изучал, как оценивает Хаскелл и не сталкивался с примером, который объяснял это. – MichaelAS

 Смежные вопросы

  • Нет связанных вопросов^_^