次のコードでは:
ismaxl :: (Ord a) => [a] -> a -> Bool
ismaxl l x = x == maxel
where maxel = 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])
部分関数 ismax は maxel を計算しますか? 具体的には、Haskell の部分関数の複雑さに関する規則を誰か指摘できますか? 上記の例で、コンパイラは maximum を 1 回だけ呼び出さなければなりませんか? 別の言い方をすれば、部分関数は、内部 where 句の以前の呼び出しの参照を保持しますか?
許容範囲内で実行されていない CPU バウンド コードがいくつかあり、複雑さについての推論で考えられるエラーを探しています。