Вот модифицированная версия вашего кода, которая позволит вам увидеть, используется ли maxel
повторно или нет:
import Debug.Trace
ismaxl :: (Ord a) => [a] -> a -> Bool
ismaxl l x = x == maxel
where maxel = trace "Hello" $ maximum l
main = do
let mylist = [1, 2, 3, 5]
let ismax = ismaxl mylist
--Is each call O(1)? Does each call remember maxel?
let c1 = ismax 1
let c2 = ismax 2
let c3 = ismax 3
let c5 = ismax 5
putStrLn (show [c1, c2, c3, c5])
Вы увидите, что maxel
не запоминается между приложениями.
Как правило, не следует ожидать, что Haskell начнет выполнять сокращения, пока все аргументов не будут переданы функции.
С другой стороны, если выесли включить агрессивную оптимизацию, трудно предсказать, что конкретно будет делать конкретный компилятор.Но вам, вероятно, не следует полагаться на какую-либо часть компилятора, которую сложно предсказать, когда вы можете легко переписать код, чтобы сделать то, что вы хотите, явным.